Как получить доступ к производной класс чистой виртуальной реализации в базовом классе?

0

Мой пример кода выглядит следующим образом:

class Base {
public:
    Base() { callVirtualfunc(); } 

    virtual void funca() = 0;

    void callVirtualfunc() { funca(); }
};
// -----------------------------------------
class Derived : public Base{
public:
    Derived() : Base() {}

    void funca() { cout<<"Hello world"<<endl; }
};

Я понимаю, что я не могу назвать чистую виртуальную функцию внутри конструктора/деструктора. Я callVirtualfunc() их внутри вызова функции callVirtualfunc(). Я получаю :: C++ runtime abort: an undefined pure virtual function was called.

Я делаю это, чтобы:

  • Принудительно использовать все производные классы для реализации funca().
  • Я также хочу гарантировать, чтобы производные классы вызывали funca().

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

  • 0
    возможный дубликат чисто виртуальной функции с реализацией
  • 1
    Вы не можете вызывать виртуальные функции (производных классов) из конструктора, точка!
Показать ещё 10 комментариев
Теги:

1 ответ

1
Лучший ответ

Согласно стандарту C++

4 Функции членов, включая виртуальные функции (10.3), могут быть вызваны во время строительства или разрушения (12.6.2). Когда виртуальная функция вызывается прямо или косвенно из конструктора или из деструктора, в том числе при построении или уничтожении нестатических элементов данных классов, а объектом, к которому применяется вызов, является объект (назовите его x) под строительство или разрушение, вызванная функция является окончательным переадресацией в классе конструкторов или деструкторов, а не переопределением ее в более производном классе. Если вызов виртуальной функции использует явный доступ к члену класса (5.2.5), а выражение объекта относится к полному объекту x или одному из подобъектов базового класса объектов, но не к x или одному из его субобъектов базового класса, поведение не определено,

а также

6 Функции-члены могут быть вызваны из конструктора (или деструктора) абстрактного класса; эффект виртуального вызова (10.3) на чистую виртуальную функцию, прямо или косвенно для создаваемого (или уничтоженного) объекта от такого конструктора (или деструктора), не определен

Поэтому в вашем примере, когда конструктор базового класса будет называться, он, в свою очередь, будет называть его чистую виртуальную функцию, а не переопределяемой функцией производного класса. И согласно второй цитате Стандарта поведение программы в таком случае не определено.

Ещё вопросы

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