C ++: «Виртуальный» наследуется всем потомкам - PullRequest
8 голосов
/ 10 апреля 2011

Предположим следующий простой случай (обратите внимание на местоположение virtual )

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 ]

7 голосов
/ 10 апреля 2011
  1. Ваш код недействителен C ++. Какие скобки в определении класса?
  2. Это зависит от динамического типа объекта, на который указывает pointer_to_b_type.
  3. Если я понимаю, что вы действительно хотите спросить, тогда «Да». Это вызывает C::func:

    C c;
    B* p = &c;
    p->func();
    
6 голосов
/ 10 апреля 2011

Примеры использования указателей, а также ссылки.

  • Использование указателя

    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

3 голосов
/ 10 апреля 2011

Вызывает функцию в классе, на который вы ссылаетесь. Однако работает, если не существует.

Попробуйте следующий код:

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

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...