2013-07-24 34 views
5

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

假设我们有4个类:A类,B类,C类和D类。 类以这种方式继承:A→B→C→D,其中A是基类。这个时候,我确信这一点:在基类(A类)中开始使用虚拟类的方法声明,使得从基类派生的所有类的方法都是虚拟的,包括派生类的派生类派生类。 (B和C类方法被确定为虚拟的)。

困惑在这里。如果在基类A中没有虚拟成员,该怎么办?相反,让我们说,B类声明一个方法是虚拟的。我假设,这种改变会使属于继承链(C和D类)的所有派生类具有虚拟的功能。所以在逻辑上,B代表C和D,是他们的“基类”,对吧?或者我错了?

回答

13

您是对的。

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

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

你完全正确。孩子继承祖先的东西。基类不能继承孩子所拥有的东西(比如新的函数或变量)。如果该子类更改虚函数的实现以便不调用基虚函数,那么虚函数就是可以被子类覆盖的函数。

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

+0

快速的建议:如果基类有一个虚方法,我应该强调的属于派生类与虚拟方法休息关键字虚拟?只是为了更具表现力。 –

+0

不是没有必要。在基类中执行一次后,所有子类都可以更改函数实现(它的所有继承)。 – theta

+0

@RobertEagle在派生类中添加'virtual'或'override'不是必需的*,但我会说_yes_,尽可能在视觉上提示函数的语义。 *除非使用像'g ++'这样的编译器,如果这些限定符丢失,会提供警告,并且您告诉将警告视为错误。 –

0

当然,你可以做到这一点。虚拟方法是可选的覆盖,所以无论您在A类还是B类声明它都无关紧要。如果您不想在类A中使用该方法,则只需在类B中声明。