5

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

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();

我想看到打印出“派生”……我得到的是“基础”。我是一名长期的 C 程序员,并且对 C++ 相当有经验……但我在这方面没有取得任何进展……任何帮助将不胜感激。

4

6 回答 6

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();
}

这为您提供了您正在寻找的东西 - 衍生。

于 2010-06-28T22:50:33.123 回答
3

该代码充满了语法错误。也许最重要的是,Derived 没有从 Base 继承。其次,除了语法错误(可能是简单的拼写错误),Base 显然需要一个虚拟析构函数。clone 方法几乎要求您可以在基指针 (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;
}
于 2010-06-28T22:45:09.760 回答
1

Base bp = &d;

你已经“切片”d了,所以对编译器来说,bp真的只是 type Base,这就是为什么当你调用bp->clone()编译器时调用Base::clone();bp2->ID()打印的原因BASE

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

于 2010-06-28T22:40:03.560 回答
0

您正在对类进行切片Base bp = &d;(这会从派生的 ptr 构造一个新的基本 bp。)

试试Base* bp = &d;吧。(即创建一个指向 Derived 对象的 Base 类型的指针。)

于 2010-06-28T22:39:05.513 回答
0

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

Base bp = &d;

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

您还有一个问题,您的两个类不相关(您是要写class Derived : public Base吗?)

于 2010-06-28T22:40:41.860 回答
0

代码看起来不错,除了愚蠢的语法错别字和缺少的 ctors。

于 2010-06-29T04:30:15.097 回答