Поймать неосуществленные чистые виртуалы в C ++

0

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

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

Теги:
pure-virtual

1 ответ

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 конструктор Base::Base завершается, объект затем становится Derived и запускается конструктор Derived::Derived.

  • 0
    Разве это не хорошая идея вызывать виртуальные функции внутри конструктора?
  • 0
    @Pradheep Конечно, нет-нет. Но приведенный выше пример делает что-то не так.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню