Рабочий образец вашего кода, после того как я удалил много других ошибок.
#include<iostream>
class A
{
virtual void f()=0;
public:
void g();
};
void A::g()
{
f();
}
class B : public A
{
void f(){std::cout<<"Inside B::f";}
};
int main()
{
B b;
b.g();
return 0;
}
Выход:
Внутри B :: f
Отправьте свой настоящий код, чтобы получить реальные ответы.
EDIT:
Теперь, когда вы показали нам свой настоящий код (в нем были ошибки компиляции, я исправил их для вас). Я понимаю вашу проблему.
Когда вы создаете объект класса B
с использованием B b;
, это приводит к вызову конструктора базового класса A::A()
, который, в свою очередь, вызывает метод g()
. Обратите внимание, что g()
является только методом Базового класса, поэтому это приводит к вызову A::g()
. Это далее называет f()
. Теперь вы ожидаете, что это должно вызвать B::f()
, но это не так.
Почему?
Обратите внимание на правило,
Внутри конструктора или деструктора тип объекта, на который указывает this
, всегда является типом, чей конструктор / деструктор вызывается.
Применяя указанное выше правило, поскольку f()
вызывается в конструкторе A
,
this->f()
звонит A::f()
, а не B::f()
. Более того, поскольку A::f()
не имеет определения (поскольку вы его не предоставили), это приводит к исключению времени выполнения:
чисто виртуальный метод называется
завершить вызов без активного исключения.
Компилятор не смог обнаружить это как ошибку времени компиляции, поскольку при virtual
вызываемая функция определяется во время выполнения в зависимости от того, на что указывает this
, а не статически. Компилятор не мог это обнаружить.
Как мне преодолеть эту проблему?
Вы не можете сделать это через динамическую диспетчеризацию в конструкторе.
Вы можете ожидать и ожидать ожидаемого поведения, если вызываете его из любого другого метода, кроме конструктора / деструктора.
Избегайте вызова виртуальных функций в конструкторах и деструкторах, потому что они не вызывают версии, которые вы думаете они могли бы вызвать.