这是我正在尝试做的事情(此代码不起作用):
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 ++有相当的经验......但是我没有在这方面取得任何进展......任何帮助都会受到赞赏。
答案 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。