【发布时间】:2019-04-19 10:42:27
【问题描述】:
我知道从构造函数/析构函数调用虚函数会解析为早期绑定。但我在这里有一个问题。看下面的代码
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() (内部将其视为使用适当的调用对象)
因为即使您进行早期绑定或后期绑定,结果都是相同的(调用本地 fun() )
另外,如果它是根据构造函数内部的早期绑定机制调用的函数的本地版本,那么我们如何调用非派生的本地函数的基本版本(我知道派生包含基本子对象,但如果构造函数在虚函数的构造函数内部执行早期绑定,则需要知道调用基本版本而不是本地/派生函数的原因)
请帮忙
【问题讨论】:
-
obj和p都是Base(静态和动态类型)... -
好的。如果我用 p = this 替换 p=&obj 会发生什么;
-
所有虚函数的虚调用(没有类名限定)都是基于动态类型而不是静态类型。这是否是“后期”绑定是一个实现问题。
标签: c++ function constructor virtual