我们可以在C++中创建一个虚拟的类复制构造函数吗?如何使用?
发布于 2012-03-27 20:38:39
不你不能。
此外,整个概念没有任何意义。虚函数是基于对象的值(对象的动态类型)调度的函数。当一个构造函数被调用时,对象还没有值(因为它还没有被构造)。因此,不可能发生虚拟分派。
想想看。这样的构造函数有什么语义?
发布于 2012-03-27 20:32:14
不是的。C++是静态类型语言,对于C++编译器来说,以多态方式创建对象是没有意义的。编译器必须知道类类型才能创建对象。换句话说,从C++编译器的角度来看,创建什么类型的对象是编译时的决定。如果我们将构造函数设为虚的,编译器会标记一个错误。
发布于 2015-12-12 11:16:18
不能这样做,因为内存是在基于新类型的大小而不是复制操作数调用构造函数之前分配的。如果它真的起作用了,那将是一个特例,它为许多语言构造颠倒了多态性。
但这并不意味着它不能用一点C++魔法来完成。:)
例如,在一些情况下,序列化非POD类是非常有用的。此示例创建一个使用placement new工作的虚拟副本构造函数。
警告:这是一个可以帮助某些用户解决特定问题的示例。不要在通用代码中这样做。如果分配给新类的内存小于派生类的内存,它将崩溃。最好的(也是唯一的)安全的使用方法是,如果你在管理你自己的类内存,并使用新的位置。
class VirtualBase
{
public:
VirtualBase() {}
virtual ~VirtualBase() {}
VirtualBase(const VirtualBase& copy)
{
copy.VirtualPlacementCopyConstructor(this);
}
virtual void VirtualPlacementCopyConstructor(void*) const {}
};
class Derived :: public VirtualBase
{
public:
...
Derived(const Derived& copy) : ... don't call baseclass and make an infinite loop
{
}
protected:
void VirtualPlacementCopyConstructor(void* place) const
{
new (place) Derived(*this);
}
};
https://stackoverflow.com/questions/9889488
复制相似问题