我有这个鳕鱼:
class First{
public:
virtual void print(){cout<<"First";}
};
class Second : public First {
public:
virtual void print(){cout<<"Second";}
};
class Third : public Second{
public:
void print(){cout<<"Third";}
int main(){
Third ob;
ob.print();
Second& sec=ob;
sec.print();
First& frs=ob;
frs.print();
}
一切都如我所料,所有3个印刷品:“第三”。
现在因为我有太多的代码而且它基本上是相同的一点点变化我将在文中讨论它。
现在我在First中从print中删除虚拟,然后打印出来:“我想要的第三个第一个”。
第三次,我把虚拟放回First,但是我将它从Second中删除了。现在它打印: “第三三三”。嗯,那不是我的预期。让我们说,当引用First时它看到函数是虚拟的,然后检查对象并调用方法为Third,但是当引用第二时它看到函数不是虚拟的,为什么它仍然调用Third的打印?
答案 0 :(得分:4)
如果一个函数覆盖了一个虚函数,那么它是虚拟的,无论你是否明确声明它。所以这里Second::print
是虚拟的,但你声明它。
答案 1 :(得分:3)
如果函数被声明为虚函数,或者它在任何基类中声明为虚函数(通过指针或引用调用时),则该函数被视为虚函数。
答案 2 :(得分:0)
最后一种情况的行为是预料之中的。您正在使用对Third类型的对象的引用。因此,在所有三个调用中都会调用此类的虚函数。您删除了类Second中的函数声明,但是cvlass从类First继承了此函数。它只是不会覆盖它。