c++ - 用纯虚方法覆盖(常规)虚方法有什么影响?

标签 c++ overriding pure-virtual

假设我们有

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/

相关文章:

c++ - 链接器无法在命名空间中找到函数定义

c++ - 声明静态可变值的正确方法是什么

c++ - 如何使用 new 在 C++ 中创建数组并初始化每个元素?

java - 了解@Override方法?

c++ - 调用纯虚函数

c++ - Qt 连接具有不同参数的信号

xslt - 覆盖 XSLT 中的命名模板

Hibernate:我可以使用 XML 和自定义生成器覆盖标识符生成器吗?

c++ - 纯虚类中的构造函数应该是 "protected"还是 "public"?

c++ - 如果一个类有一个非纯析构函数,它还能是纯抽象的吗?