虚方法继承类

时间:2014-01-17 11:39:45

标签: c++ inheritance virtual

我有:

class A
{
   virtual void get();
}

class B: public A
{
   void get();
}

class C: public B
{
   void get();
}

int main()
{
   B     *i;

   i = new C();
   i.get();
   return (0);
}

如果A :: get()是虚拟的:

  

i.get()调用C :: get()

如果A :: get()不是虚拟的:

  

i.get()调用B :: get()

我的问题是:

为什么我不需要在B :: get()上放置虚拟以使用带有B.get()的C :: get()?

2 个答案:

答案 0 :(得分:4)

从基类覆盖虚方法的方法也将隐式虚拟 - 这适用于整个ihneritance链。

struct A {
    virtual int f(int);
};

struct B : A {
    int f(int); // overrides A::f, implicitly virtual
    void g(float);
};

struct C : B {
    int f(int); // overrides B::f, implicitly virtual
    int f(char);  // doesn't override anything, not virtual
    void g(float); // doesn't override and isn't virtual,
                   // because B::g is not virtual either.
                   // It hides B::g instead.
};

答案 1 :(得分:1)

当在基类中声明成员函数 virtual时,对于所有子类,它将是virtual。您可以在子类中省略virtual关键字这一事实并不意味着它不是虚拟的。

您对所提议代码的假设如下:

int main()
{
   B* i;
   i = new C();
   i.get();
   return (0);
}

被上述代码won't even compile误导(即使你在每个类声明/定义的末尾添加了分号)。

当您处理指针并且想要调用成员函数时,您可以取消引用指针并使用.运算符:

(*ptr).function();

或使用->运算符:

ptr->function();

你的代码都没有。但假设你的意思是:

int main()
{
   B* i = new C();
   i->get();
}

你的假设结果是正确的:

  • 如果A::get是虚拟的,则在i->get中,C::get将被称为
  • 否则将调用B::get
  

为什么我不需要将B::get()上的虚拟内容与C::get()一起使用B.get()

你没有。 void get()成员函数从基类开始是虚拟的,一直到C类。您无需重复virtual个关键字,但我实际上会推荐它。