【问题标题】:creating a new derived type based on another class基于另一个类创建新的派生类型
【发布时间】:2018-05-22 05:03:05
【问题描述】:

我正在尝试从指向派生类的父类指针中获取新的派生类指针(带有新的内存位置)。

#include <iostream>
#include <random>
class parent{
public:
    virtual void print(){
        printf("p\n");
    }
};

class dev1: public parent{
public:
    void print(){
        printf("d1\n");
    }
};

class dev2:public parent{
public:
    void print(){
        printf("d2\n");
    }
};

int main(int argc, const char * argv[]) {
    srand(time(NULL));

    parent*bob;

    if(rand()%2){
        bob = new dev1();
    }else{
        bob = new dev2();
    }
    bob->print();

    parent * bobwannabe;

    bobwannabe = new typeof(*bob);

    bobwannabe->print();

    return 0;
}

我希望 bobwannabe 能打印出 bob 打印的内容。 bobwannabe 不应指向与 bob 相同的对象,而应与 bob 属于同一类。

现在,bobwannabe 成为新父母。有没有办法将它变成一个具有当前类型的新鲍勃,或者我应该搜索一个特定的术语? 谢谢!

【问题讨论】:

标签: c++11 memory types


【解决方案1】:

你想要的是克隆对象。你需要自己添加一个虚拟克隆方法和复制构造函数到父类:

 virtual parent * clone() const { return new parent(*this); }

并覆盖 所有 派生类,例如 dev1

 virtual parent * clone() const override { return new dev1(*this); }

并用于:

 parent *bobwannabe = bob->clone();

另请参阅'typeid' versus 'typeof' in C++,不要忘记删除您的对象或使用智能指针。

【讨论】:

  • 提示:您可以使用new auto(*this) 避免手动输入类型。但是您应该使用 std::unique_ptr 而不是原始的拥有指针。无论如何,CRTP 是在所有类中注入此clone 函数的完美工具。
猜你喜欢
  • 1970-01-01
  • 2015-08-16
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
相关资源
最近更新 更多