派生的C ++类如何通过基指针克隆自身?

时间:2010-06-28 22:35:34

标签: c++ cloning

这是我正在尝试做的事情(此代码不起作用):

class Base
{
    virtual Base *clone() { return new Base(this); }
    virtual void ID() { printf("BASE");
};

class Derived : publc Base
{
    virtual Base *clone() { return new Derived(this); }
    virtual void ID() { printf("DERIVED"); }
}

.
.
Derived d;
Base *bp = &d;
Base *bp2 = bp->clone();

bp2->ID();

喜欢什么是看到“DERIVED”打印出来的...我得到的是“BASE”。我是一名长期的C程序员,并且对C ++有相当的经验......但是我没有在这方面取得任何进展......任何帮助都会受到赞赏。

6 个答案:

答案 0 :(得分:7)

一旦修复了所有编译错误,我最终得到了这个:

#include <cstdio>

class Base
{
  public:
    Base() {}
    Base(const Base&) {}
    virtual Base *clone() { return new Base(*this); }
    virtual void ID() { printf("BASE"); }
};

class Derived : public Base
{
  public:
    Derived() {}
    Derived(const Derived&) {}
    virtual Base *clone() { return new Derived(*this); }
    virtual void ID() { printf("DERIVED"); }
};


int main()
{
  Derived d;
  Base *bp = &d;
  Base *bp2 = bp->clone();

  bp2->ID();
}

它可以为您提供所需的内容 - 衍生。

答案 1 :(得分:3)

该代码充满了语法错误。也许最重要的是,Derived不会继承Base。其次,除了语法错误(可能是简单的错别字),Base显然需要一个虚拟析构函数。克隆方法几乎要求您可以在基指针(Base *)上调用operator delete。

class Base
{
public:
    virtual ~Base() {}
    virtual Base* clone() const { return new Base(*this); }
    virtual void ID() const { printf("BASE"); }
};

class Derived: public Base
{
public:
    // [Edit] Changed return type to Derived* instead of Base*.
    // Thanks to Matthieu for pointing this out. @see comments below.
    virtual Derived* clone() const { return new Derived(*this); }
    virtual void ID() const { printf("DERIVED"); }
};

int main()
{
    Derived d;
    Base* bp = &d;

    Base* bp2 = bp->clone();
    bp2->ID(); // outputs DERIVED as expected
    delete bp2;
}

答案 2 :(得分:1)

使用Base bp = &d;

你已经“切片”d,所以对于编译器来说,bp实际上只是Base类型,这就是为什么当你调用bp->clone()编译器调用时Base::clone();bp2->ID()打印BASE

Base& bp = d;会做你想做的事。

答案 3 :(得分:0)

你是Base bp = &d;中的slicing类(这是从derived-ptr构造一个新的基础bp。)

请尝试使用Base* bp = &d;。 (即为Derived对象创建Base类型的指针。)

答案 4 :(得分:0)

您的示例不正确,无法编译。特别是这一行:

Base bp = &d;

这也可能是你问题的根本原因(你可能正在切片你的对象),但是如果没有看到工作代码,我无法确定。

你也遇到一个问题,你的两个班级没有关系(你的意思是写class Derived : public Base吗?)

答案 5 :(得分:0)

代码看起来很好,除了愚蠢的语法错误和丢失的ctors。