class Class1
{
public:
void print()
{
cout << "test" << endl;
}
void printl()
{
print();
}
};
class Class2 : public Class1
{
public:
void print()
{
cout << "test2" << endl;
}
};
为什么print()不会在Class2中被覆盖,是否有任何方式可以像这样覆盖一个函数? (没有虚函数)。感谢
Class2 t;
t.printl();
答案 0 :(得分:10)
没有。这是虚函数的全部原因。
这里没有虚方法,当printl()调用print()时,它调用Class1.print()
,打印“test”。如果您将方法标记为虚拟,那么它将按照您的预期处理它。
答案 1 :(得分:3)
不,没有办法覆盖非虚函数。这就是虚拟功能的用途。
答案 2 :(得分:2)
您想要的是一个虚拟方法。只需在当前virtual void print()
的位置写下void print()
,它就可以正常运行。请注意,这在构造函数或析构函数中不起作用。
答案 3 :(得分:0)
printl内部打印调用未被覆盖,因为它不是虚方法。它是一种非虚方法,因此被非虚拟地调用。如果您希望被子类覆盖,则将其设为虚拟。
答案 4 :(得分:0)
想象一下,你有Class2,Class3和Class3,都是“覆盖”Class1的“打印”方法。
当调用Class1 :: printl时 - 如何知道要调用的3个覆盖中的哪一个?如果没有虚方法,printl实现无法知道选择哪种重写方法。