首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我们可以在C++中创建一个虚拟的类复制构造函数吗?

我们可以在C++中创建一个虚拟的类复制构造函数吗?
EN

Stack Overflow用户
提问于 2012-03-27 20:24:22
回答 5查看 23.6K关注 0票数 35

我们可以在C++中创建一个虚拟的类复制构造函数吗?如何使用?

EN

回答 5

Stack Overflow用户

发布于 2012-03-27 20:38:39

不你不能。

此外,整个概念没有任何意义。虚函数是基于对象的值(对象的动态类型)调度的函数。当一个构造函数被调用时,对象还没有值(因为它还没有被构造)。因此,不可能发生虚拟分派。

想想看。这样的构造函数有什么语义?

票数 6
EN

Stack Overflow用户

发布于 2012-03-27 20:32:14

不是的。C++是静态类型语言,对于C++编译器来说,以多态方式创建对象是没有意义的。编译器必须知道类类型才能创建对象。换句话说,从C++编译器的角度来看,创建什么类型的对象是编译时的决定。如果我们将构造函数设为虚的,编译器会标记一个错误。

票数 2
EN

Stack Overflow用户

发布于 2015-12-12 11:16:18

不能这样做,因为内存是在基于新类型的大小而不是复制操作数调用构造函数之前分配的。如果它真的起作用了,那将是一个特例,它为许多语言构造颠倒了多态性。

但这并不意味着它不能用一点C++魔法来完成。:)

例如,在一些情况下,序列化非POD类是非常有用的。此示例创建一个使用placement new工作的虚拟副本构造函数。

警告:这是一个可以帮助某些用户解决特定问题的示例。不要在通用代码中这样做。如果分配给新类的内存小于派生类的内存,它将崩溃。最好的(也是唯一的)安全的使用方法是,如果你在管理你自己的类内存,并使用新的位置。

代码语言:javascript
复制
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);
    }
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9889488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档