加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在此放置新的

发布时间:2020-12-16 10:52:44 所属栏目:百科 来源:网络整理
导读:我看到了一些这样的代码: class BaseClass{public: BaseClass(int param);};class Derived: public BaseClass{};BaseClass::BaseClass(int param){ new (this) Derived;} 代码试图做什么?我认为它会创建一个派生类对象.但是,背后的逻辑是什么?我想当我们
我看到了一些这样的代码:

class BaseClass
{
public:
    BaseClass(int param);
};

class Derived: public BaseClass
{
};

BaseClass::BaseClass(int param)
{
    new (this) Derived;
}

代码试图做什么?我认为它会创建一个派生类对象.但是,背后的逻辑是什么?我想当我们调用new BaseClass()时,它只会根据基类大小分配内存.但是,为什么我们仍然可以将此指针传递给新的位置来构造Derived类对象?

编辑:
谢谢回复.在进一步检查时,代码确实为基类覆盖operator new以分配足以保存派生类对象的内存并避免递归调用它,在派生类构造函数中,它调用另一个基类构造函数.

基本上我认为它试图创建像工厂一样创建对象的东西取决于参数.根据答复,这样做似乎不是一个好习惯.

解决方法

对于大约六个bajillion的原因,这是可怕的未定义行为.不要永远这样做.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读