Наследование.Вызов функции дочернего класса из родительского класса. - PullRequest
1 голос
/ 28 марта 2012
class C1 {
    void A();
    void B();
}

void C1::A(){ return B(); }

class C2 : public C1 {
    void B();
}

C2 *obj = new C2;
obj->A(); // returns B() from C1

Почему вызывается B () из C1? Как заставить A () существовать только в C1 и вызывать B () из C2?

Ответы [ 2 ]

10 голосов
/ 28 марта 2012

Вам нужно сделать B() в C1 a virtual.

Виртуальные функции - это, в основном, указатели на функции, которые принимают значение при инициализации объекта. Если вы new C1, указатель функции будет указывать на C1::B, а если вы new C2, то указатель функции будет указывать на C2::B.

Примечание: Чтобы узнать больше о virtual и связанных предметах, найдите переопределение функций и полиморфизм .

2 голосов
/ 28 марта 2012

Методы-члены не являются virtual по умолчанию в C ++ (вы пришли из Java)?

Когда вы пишете:

class C1 {
    void A();
    void B();
}

class C2 : public C1 {
    void B();
}

, вы не переопределяете B() в C2, но скрывает это.

Чтобы переопределить его, вы должны объявить его virtual в базовом классе ( virtual в последующих классах не требуется).

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