2013-10-15 6 views
0

Как я понимаю, существуют условия, при которых чисто-виртуальный метод не может быть реализован в дочернем классе, но дочерний класс может быть вызван без него, что приведет к ошибке сборки.Поймать невыполненные чистые виртуальные машины в C++

Мне не удалось смоделировать это. Кто-нибудь знает, как это сделать? Я выполнил ряд поисков, но не смог ничего сделать.

ответ

6

Это происходит, когда виртуальная функция вызывается в конструкторе базового класса.

#include <iostream> 

class Base 
{ 
public: 
    Base() { g();} 
    virtual ~Base() {} 

    void g() { f(); } 
    virtual void f() = 0; 
}; 

class Derived : public Base 
{ 
public: 
    Derived() : Base() {} 
    ~Derived() {} 

    void f() { std::cout << "Derived f()" << std::endl; } 
}; 

int main() 
{ 
    Derived d; // here we have the call to the pure virtual function 

    return 0; 
} 

РЕДАКТИРОВАТЬ:

Основной проблемой является: когда Derived объект построен, объект начинается как Base, то конструктор Base::Base выполняется. Поскольку объект по-прежнему Base, вызов f() (через g()) вызывает Base::f, а не Derived::f. После завершения конструктора Base::Base объект затем становится Derived и запускается конструктор Derived::Derived.

+0

Не правда ли, чтобы вызвать виртуальные функции внутри конструктора? – Pradheep

+0

@ Pradheep Конечно, это нет. Но вышеприведенный пример является неправильным. –

+0

@ Pradheep - нет ничего плохого в вызове виртуальных функций внутри конструктора (или деструктора). «Правило», что это плохая идея, исходит от людей, которые не понимают, как работает такой звонок. Он вызывает версию, определенную для типа, чей конструктор (или деструктор) в настоящий момент запущен, что не обязательно является самым производным типом. –

Смежные вопросы