如果我有这样的内容,当我有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
};
答案 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(注意基类中的任何虚函数在派生类中继续保持虚拟)。