【发布时间】: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(); // ??
}
【问题讨论】:
-
您只能使用
overridevirtual函数。这就是它在语言标准中的定义方式。非virtual函数只能隐藏,不能覆盖 -
这在good books中都有解释。
标签: c++