C 虚拟函数意外行为

C++ virtual functions unexpected behavior

本文关键字:意外 函数 虚拟      更新时间:2023-10-16

我已经有这个鳕鱼:

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印刷:"第三"。

现在,因为我有太多代码,并且基本上是相同的,我将在文本中讨论它。

现在,我首先将Virtual删除,并打印出来:"第三个第一个",如我所期望的。

这是第三次,我首先将虚拟放回,但我从第二次将其删除。现在打印:"第三三分之二"。嗯,那不是我所期望的。可以说,当首先使用参考时,它会看到该函数是虚拟的,然后检查对象并调用第三种方法,但是当参考second时,它发现函数不是虚拟的,为什么它仍然会调用第三个print?

如果一个函数覆盖了虚拟函数,那么无论您是否明确声明它是虚拟函数。因此,这里的Second::print是虚拟的,但是您要声明它。

函数如果将其声明为Vivutal或在任何一个基类中被声明为虚拟的,则将其视为虚拟函数(当通过指针或参考调用时)。

预期在最后一个情况下的行为。您正在使用对第三类的对象的引用。因此,在所有三个呼叫中都调用此类的虚拟函数。您删除了第二类函数的声明,但CVLass首先从类中继承了此功能。它只能覆盖它。