Я знаю, что вызов виртуальной функции из конструктора / деструктора преобразуется в раннее связывание. Но у меня есть вопрос здесь. Посмотрите на приведенный ниже код
class Base
{
public:
virtual void fun()
{
cout<<"In Base"<<endl;
}
};
class Derived : public Base
{
public:
Derived(Base obj)
{
Base *p;
p = &obj;
p->fun();
}
void fun()
{
cout<<"In Derived"<<endl;
}
};
int main()
{
Base b;
Derived d(b);
}
O / P: В базе
Я сомневаюсь, что компилятор может использовать динамическое связывание вместо раннего. Пожалуйста, исправьте меня, я ошибаюсь, но мне нужно четкое объяснение того, как компилятор выполняет раннее связывание внутри конструктора?
Если метод не является конструктором, компилятор преобразует этот оператор p-> fun в что-то вроде
fetch the VPTR at run time (This vptr will have the derived class VTABLE address)
invoke method at vptr + offset
hence the right virtual function is invoked.
но, поскольку он является конструктором, компилятор останавливает рассмотрение виртуального механизма и просто забывает о типе указателя и заменяет вышеприведенный оператор p-> fun () на obj.fun () (внутренне обрабатывая его как вызов соответствующим объект)
Потому что даже если вы делаете раннее или позднее связывание, результат остается тем же самым (вызывая local fun ())
Также, если это локальная версия функции, которая вызывается в соответствии с механизмом раннего связывания внутри конструктора, то как мы вызываем базовую версию функции, которая не является локальной для производной (я понимаю, что производная содержит базовую подпрограмму) объект, но необходимо знать причину вызова базовой версии, а не локальной / производной функции, если конструктор выполняет раннее связывание внутри конструктора для виртуальных функций)
Пожалуйста, помогите