C ++:“虚拟”是否继承给所有后代

时间:2011-04-10 08:49:06

标签: c++ inheritance virtual-functions

假设以下简单情况(注意虚拟的位置)

class A {
    virtual void func();
};

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

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

以下来电是致电B::func()还是C::func()

B* ptr_b = new C();
ptr_b->func();

3 个答案:

答案 0 :(得分:7)

  1. 您的代码无效C ++。类定义中的括号是什么?
  2. 这取决于pointer_to_b_type指向的对象的动态类型。
  3. 如果我理解你想要问的是什么,那么'是'。这会调用C::func

    C c;
    B* p = &c;
    p->func();
    

答案 1 :(得分:6)

使用指针和引用的示例。

  • 使用指针

    B *pB = new C();
    pB->func(); //calls C::func()
    
    A *pA = new C();
    pA->func(); //calls C::func()
    
  • 使用参考。注意最后一个电话:最重要的电话。

    C c;
    B & b = c;
    b.func(); //calls C::func() 
    
    //IMPORTANT - using reference!
    A & a = b;
    a.func(); //calls C::func(), not B::func()
    

在线演示:http://ideone.com/fdpU7

答案 2 :(得分:3)

它调用你所指的类中的函数。然而,如果它不存在,它就会起作用。

请尝试以下代码:

#include <iostream>
using namespace std;

class A {
    public:
    virtual void func() { cout << "Hi from A!" << endl; }
};

class B : public A {
    public:
    void func()  { cout << "Hi from B!" << endl; }
};

class C : public B {
    public:
    void func()  { cout << "Hi from C!" << endl; }
};

int main() {
  B* b_object = new C;
  b_object->func();
  return 0;
}

希望这有帮助