c++ - 从派生构造函数调用基类的虚函数
问题描述
我知道从构造函数/析构函数调用虚函数会解析为早期绑定。但我在这里有一个问题。看下面的代码
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() )
此外,如果它是根据构造函数内部的早期绑定机制调用的函数的本地版本,那么我们如何调用不是派生本地的函数的基本版本(我理解派生包含基本子对象但需要如果构造函数在虚拟函数的构造函数内部执行早期绑定,则了解调用基本版本而不是本地/派生函数的原因)
请帮忙
解决方案
因为您将实际传递Base
给创建者(而不是指针或引用),所以您所拥有的是一个实际Base
实例 - 将指针转换Derived*
为无效。
推荐阅读
- python - 如何在使用这些值运行一段时间时验证用户输入
- r - 从内存中释放 H2O 网格?
- python - 新下载的图像收到错误消息:无法识别图像文件中的数据。但是旧图像有效吗?
- java - 有人可以帮助我理解 Java 构造函数和方法吗?
- linux - 如何在我的 Windows 系统中获取 'sudo' 和 'apt-get' 之类的 linux 命令?我知道 Chocolatey,我只想要 Linux 命令
- php - 在函数中使用 php 循环显示星级评分
- java - 使用 ThreadPoolExecutor 缩放 maxPoolSize;为什么池不会动态增加其大小?
- android - 约束布局中的浮动操作按钮
- python - Python中“dict”的内存分配如何工作?
- ios - 通过 CustomStringConvertible 从 Struct 形成字符串