Согласно стандарту, мы знаем, что конструктор всегда идет на раннее связывание виртуальной функции внутри них, потому что они не имеют полного представления об обратной стороне иерархии производного класса.
В этом случае, если раннее связываниеиспользуется внутри моего базового конструктора, я передал производный объект в указатель базового класса, который является полностью приемлемым (здесь выполняется обновление).Если используется раннее связывание, выбор виртуальной функции должен основываться на типе указателя (здесь Base *), а не на содержимом указателя (объект, на который указывает указатель, потому что мы не знаем точный объектбудучи указанным).В этом случае, поскольку тип указателя - Base *, мы должны были вызывать только виртуальную функцию базового класса в обоих случаях.Может, кто-нибудь прояснит это?
Я думаю, что здесь используется динамическое связывание, а не раннее связывание.Пожалуйста, исправьте меня, если мое понимание неверно.
Первая строка вывода, которая вызывает базу, полностью в порядке
class Base
{
public:
Base(){
fun();
}
Base(Base *p)
{
p->fun();
}
virtual void fun()
{
cout<<"In Base"<<endl;
}
};
class Derived : public Base
{
public:
void fun()
{
cout<<"In Derived"<<endl;
}
};
int main()
{
Derived d;
Base b(&d);
}
O / P:
In Base
In Derived