mad*_*adu 2 c++ virtual-functions copy-constructor
在C++中,如果未定义复制构造函数,编译器将为您执行此操作.如果定义了一个,编译器就不会.编译器生成的复制构造函数可以是微不足道的或非平凡的.在一个简单的复制构造函数中,它执行成员方式的复制.而已.
但是,如果存在虚函数,则复制构造函数不重要.它不仅可以按比特复制.
所以这是我的计划.没什么特别的.只是为了说明我的观点..
#include<iostream>
using namespace std;
class baseClass
{
public:
int var;
int* varPtr;
const float floatVar;
int &intRefVar;
baseClass(int value) : var(value), varPtr(&var), floatVar(value), intRefVar(var)
{
cout << "baseClass constructor" << endl;
}
baseClass(const baseClass& objToCopy) : var(objToCopy.var), varPtr(&var), floatVar(objToCopy.floatVar), intRefVar(var)
{
cout << "baseClass copy constructor" << endl;
}
virtual void func()
{
cout << "Just a virtual func." << endl;
}
};
class derivedClass : public baseClass
{
public:
derivedClass(int value) : baseClass(value)
{
cout << "derivedClass constructor" << endl;
}
derivedClass(const derivedClass& objToCopy) : baseClass(objToCopy)
{
cout << "derivedClass copy constructor" << endl;
}
virtual void func()
{
cout << "Just another virtual func." << endl;
}
};
int main(int argc, char** argv)
{
derivedClass derClassObj1(10);
derivedClass derClassObj2(derClassObj1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个节目中,
这是我的问题:
干杯.
由于vptr的存在,非平凡复制构造函数与普通复制构造函数有何不同?
vptr不是从源对象复制的,而是必须初始化以指向目标类的虚拟表.因此,从源到目的地的直接"memcpy"副本是不可能的.
另外,请记住,拥有vptr并不是严格要求,兼容的实现可以通过其他方式实现虚拟调度(我不知道会是什么).虽然,AFAIK,所有实现都使用这种机制.但无论实现选择哪种方式做事,很明显会有一些像vptr这样的信息必须以某种与直接"memcpy"副本不兼容的方式设置.
为什么不能复制vptr?如果两个相同类型的对象(继承中的级别相同),它们都可以指向相同的vtable,它们可以不是吗?
这里的棘手问题是假设你做了"两个相同类型的对象".在一般情况下不是这样.源对象很可能是某个其他派生类,因此具有不同的虚拟表指针.另一个(更罕见的)实际问题与跨模块代码(在不同的DLL/so文件或可执行文件中)有关,其中两个相同类型的对象可能使用不同的虚拟表(例如,有一些极端情况或hackish代码这可以在不破坏ODR的情况下实现,就像不同的模板实例一样).
但重点是,编译器无法确保对于复制构造函数的任何使用,只需从源对象复制vptr并期望它适合目标对象是安全的.
由于我已经定义了自己的复制构造函数,编译器是否"添加"特殊指令到我的复制构造函数来处理虚拟性?
是.确实如此.我不记得确切的规范,但基本上要求是,当你点击构造函数的主体时,vptr(或用于动态分派的任何其他机制)被初始化.这实际上要求编译器在所有用户定义的构造函数中添加代码以隐式初始化vptr.
| 归档时间: |
|
| 查看次数: |
566 次 |
| 最近记录: |