12

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

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

到了这个时候,我确信这一点:在基类(A 类)中以 virtual 开头的类方法声明,使得从基类派生的所有类的方法都是虚拟的,包括派生类的派生类。(B 和 C 类方法确定为虚拟)。

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

4

3 回答 3

21

你是对的。

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

#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;
}
于 2013-07-24T19:10:32.413 回答
5

你是完全正确的。孩子继承了它的祖先所拥有的东西。基类不能继承子类拥有的东西(例如新函数或变量)。如果子类更改了虚函数的实现,从而不调用基本虚函数,则虚函数就是可以被子类覆盖的简单函数。

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

于 2013-07-24T19:01:16.030 回答
0

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

于 2013-07-24T19:02:59.970 回答