从派生构造函数调用基类的虚拟函数



我知道从构造函数/析构函数调用虚拟函数会解析为早期绑定。但我有一个问题。查看以下代码

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-in转换为类似的内容

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((内部将其视为使用适当对象调用(

因为即使您进行早期绑定或后期绑定,结果也是相同的(调用本地函数(((

此外,如果是根据构造函数内部的早期绑定机制调用的函数的本地版本,那么我们如何调用不是派生函数本地的函数的基本版本(我知道派生函数包含基本子对象,但如果构造函数在虚拟函数的构造函数内部执行早期绑定,则需要知道调用基本版本而不是本地/派生函数的原因(

请帮助

因为将实际的Base传递给创建者(而不是指针或引用(,所以存在实际的Base实例-将指向的指针强制转换为Derived*是无效的。

最新更新