继承层次结构中的虚函数

时间:2014-01-06 16:57:47

标签: c++ class inheritance virtual-functions

如果我有这样的内容,当我有a* mya=new c();并且我致电a->displayStuff时,它会调用Class a方法,并且当virtual位于Class a时而不是Class b,它调用Class b方法。

由于Class c没有实现此方法,此处应用的规则是什么?

class a
{
public:
void displayStuff() {}
//other methods
};

class b:public a
{
public:
virtual void displayStuff() {}
//other methods
};

class c:public b
{
//other methods
};

2 个答案:

答案 0 :(得分:2)

在第一个案例中,A类没有虚函数。因此将调用其非虚函数displayStuff。在第二种情况下,当您在类A中的函数中添加函数说明符virtual时,相应的函数inclass B重新定义了此函数。所以在第二种情况下,调用类B的函数是因为虚函数指针表包含指向B类中定义的函数的指针。

答案 1 :(得分:1)

  

由于C类没有实现此方法,因此规则是什么   在这里申请?

继承规则适用。根据继承成员和继承类型的可见性,B类中可见的成员将在C类中可见。在这种情况下,当您公开继承时,所有公共成员都将公开显示。因此,B类中的公共虚拟成员函数将作为C类中的公共虚拟函数可见。

  

确切地说,但是当我有多个级别时,何时使用什么以及为什么   继承?

这是一个设计决定。请记住,非虚拟成员函数在编译时绑定,因此在您打算调用该函数之前,无法解析通过基指针的任何函数调用。 考虑场景

                                        Base
                                      public: foo
                                       /    \
                                      /      \
                                     /        \
                                    /          \ 
                                   /            \
                                Derived1      Derived2    
                              public: foo   public: foo

Base *p;
std::cin>>cond;
if (cond)
    p = new Derived1();
else
    p = new Derived1();
p->foo();

在上面的代码中,调用foo()(Derived1 :: foo或Derived2 :: foo)的决定取决于在运行时无法确定的某些外部条件。实现这一目标的唯一方法是创建一个vTable,如果我们在类virtual中至少创建一个函数,则只能强制创建一个vTable(注意基类中的任何虚函数在派生类中继续保持虚拟)。