【问题标题】:Virtual function inheritance虚函数继承
【发布时间】:2013-07-24 10:27:17
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ class inheritance virtual-functions


    【解决方案1】:

    你是对的。

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

    #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;
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 快速建议:如果基类有虚方法,我应该用关键字virtual 突出显示属于派生类的其余虚方法吗?只是为了更具表现力。
      • 不是没有必要。在基类中执行一次,所有子类都可以更改函数实现(全部继承)。
      • @RobertEagle 在派生类中添加virtualoverride 不是必须的*,但我会说,将视觉提醒放在尽可能使用函数的语义。 *除非使用像 g++ 这样的编译器,如果缺少这些限定符会提供警告,并且您告诉将警告视为错误。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-21
        • 2015-08-23
        • 2015-08-07
        • 2012-08-06
        • 2018-10-09
        相关资源
        最近更新 更多