虚拟函数继承

Virtual function inheritance

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

我对继承方法的虚拟属性感到困惑。

假设我们有四个班:A班、B班、C班和D班。类通过以下方式继承:A->B->C->D,其中A是基类。

到目前为止,我确信这一点:在基类(类a)中以virtual开始类方法声明,使该方法对于从基类派生的所有类都是虚拟的,包括派生类中的派生类。(B和C类方法被确定为虚拟的)。

混乱就在这里。如果在基类A中没有任何虚拟成员,该怎么办。相反,假设类B声明一个方法是虚拟的。我假设,对于属于继承链的所有派生类(C和D类),此更改将使函数成为虚拟的。所以从逻辑上讲,B代表C和D,是它们的一种"基类",对吧?还是我错了?

你是对的。

我认为在这种情况下,最好的解决方案是尝试:

#include <iostream>
using namespace std;
class A {
   public:
      void print(){ cout << "print A" << endl; };
};
class B: public A {
    public:
       virtual void print(){ cout << "print B" << endl; };
};
class C: public B {
     public:
        void print(){ cout << "print C" << endl; };
};
int main()
{
   A *a = new C();
   B *b = new C();
   a->print(); // will print 'print A'
   b->print(); // will print 'print C'
   return 1;
}

你完全正确。孩子继承了祖先的财产。基类不能继承子级所拥有的内容(例如新函数或变量)。虚拟函数只是子类可以重写的函数,如果该子类更改了虚拟函数的实现,从而不调用基虚拟函数。

A是B、C、D的基类。B是C、D的基类,C也是D的基类。

当然可以。虚拟方法是可选的,所以你在类A或B中声明它并不重要。如果你不想在类A中使用该方法,那么只需在类B中声明即可。