假设我们有
class A {
public:
virtual int foo() { cout << "foo!"; }
}
class B : public A {
public:
virtual int foo() =0;
}
class C : public B {
public:
virtual int foo() { cout << "moo!"; }
}
这真的是覆盖吗?我认为这实际上是重载。 在设计方面做出这样的事情有什么意义?
我们得到了一个基类A。然后我们得到了一个从具体类A派生的抽象派生类B,然后通过C实现了B。
我们在这里做什么,这样做有意义吗?
最佳答案
重载意味着您有两个同名但参数不同的函数。这里不是这种情况。
例子:
int functionA() { /*...*/ };
int functionA(int someParameter) { /*...*/ };
覆盖意味着在子类中用相同的参数重写一个函数。这就是您举的例子。
这是定义部分。现在开始设计:
当你有一个纯虚函数时,具体的子类必须覆盖它。因此,通过添加纯虚函数,您可以确保所有子类都提供相同的函数集(=接口(interface))。示例代码中似乎就是这种情况。
但这不是一个很好的例子,因为具体的父类(super class)已经实现了 foo() 的默认功能。当有一个抽象子类将其重新定义为纯虚拟时,这对我来说是类层次结构存在缺陷的标志,因为子类(以及 foo() 的调用者)通常应该能够回退到默认实现。用这样一个抽象的例子来解释有点困难,但像这样的层次结构在我看来有点可疑。
关于c++ - 用纯虚方法覆盖(常规)虚方法有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/483255/