C++ 虚函数继承

C++ 虚函数继承,c++,class,inheritance,virtual-functions,C++,Class,Inheritance,Virtual Functions,我对继承方法的虚拟属性感到困惑 假设我们有4个类:A类、B类、C类和D类。 类通过以下方式继承:A->B->C->D,其中A是基类 到目前为止,我确信这一点:在基类(类a)中以virtual开始类方法声明,使从基类派生的所有类的方法都是虚拟的,包括派生类的派生类。(确定为虚拟的B类和C类方法) 混乱就在这里。如果在基类A中没有任何虚拟成员该怎么办。相反,假设类B将一个方法声明为虚拟的。我假设,此更改将使属于继承链的所有派生类(C和D类)的函数都是虚拟的。从逻辑上讲,B代表C和D,是它们的“基类”

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

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

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


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

你完全正确。孩子继承祖先所拥有的一切。基类不能继承子类拥有的内容(例如新函数或变量)。虚拟函数只是在子类更改虚拟函数的实现以便不调用基虚拟函数时可以被该子类重写的函数


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

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

您是正确的

我认为在这种情况下,最好的解决办法是:

#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;
}
#包括
使用名称空间std;
甲级{
公众:

void print(){cout Quick suggestion:如果基类有一个虚方法,我是否应该用关键字virtual?突出显示属于派生类的其余虚方法,以便更具表现力。不需要。在基类中执行一次可以使所有子类都能够更改函数实现(全部继承).@RobertEagle在派生类中添加
virtual
override
是不必要的*,但我想说是的,最好尽可能将函数语义的可视化提示放在其中。*除非使用
g++
之类的编译器,如果缺少这些限定符,就会发出警告,并告诉您处理war这是错误。