【问题标题】:Overriding non-virtual function from abstract grandparent class从抽象祖父类重写非虚拟函数
【发布时间】:2021-11-12 17:05:54
【问题描述】:

我正在学习和玩继承和抽象类。我遇到了一个困境,希望得到一些澄清。

我正在尝试从抽象祖父类重写非虚拟函数。我收到一条错误消息,说用“override”声明的成员函数不会覆盖基类成员

我可以从 main() 中的子类实例调用原始的非虚拟函数,但不能在子类中覆盖它们?

这是代码。

更新: 当我将该功能标记为虚拟时,错误消失了,我仍然希望解释一下为什么需要该虚拟?

#include <iostream>

using namespace std;


class A
{
public:
    virtual string GetClassName() = 0;
    void foo(); // <--- this is the problem function
    {
        cout << "foo" << endl;
    }
};


class B : public A
{
public:
    string GetClassName() override
    {
        return "B";
    }
};


class C1 : public B
{
public:
    string GetClassName() override
    {
        return "C";
    }
};


class C2 : public B
{
public:
    void foo() override // ERROR:member function declared with override does not override a base class member.
    {
        cout << "foo c1" << endl;
    }
};


// testing interface
void printName(A* ptr)
{
    cout << ptr->GetClassName() << endl;
}


int main()
{

    B* b = new B();
    C1* c1 = new C1();
    C2* c2 = new C2();

    printName(b); // prints B
    printName(c1); // prints C
    printName(c2); // prints B

    b->foo(); // prints foo, inherited directly from abstract class
    c1->foo(); // prints foo, inherited directly from abstract class
    c2->foo(); // ??
}

【问题讨论】:

  • 您只能使用override virtual 函数。这就是它在语言标准中的定义方式。非virtual函数只能隐藏,不能覆盖
  • 这在good books中都有解释。

标签: c++


【解决方案1】:

您不能覆盖非虚拟函数。就这么简单。

子类中的方法同名时可以隐藏父类的方法,例如:

struct A {
    void foo(){}
};
struct B : A {
    void foo() {}
};

但这不是压倒一切的。要覆盖该方法必须是虚拟的。这是override 说明符有助于检查的条件之一:

struct A {
    virtual void foo(){}
};
struct B : A {
    void foo() override {}  // <- error if A::foo is not virtual
};

PS:我见过糟糕的教程,它们使用第一个示例并将其称为覆盖。那是错误的。

【讨论】:

    猜你喜欢
    • 2019-12-08
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 2019-04-20
    • 2020-07-01
    • 1970-01-01
    • 2011-05-21
    • 2011-03-21
    相关资源
    最近更新 更多