Этот код пронизан синтаксическими ошибками.Возможно, что наиболее важно, Derived не наследуется от Base.Во-вторых, кроме синтаксических ошибок (возможно, простых опечаток), Base явно нуждается в виртуальном деструкторе.Метод clone в значительной степени требует, чтобы вы могли вызывать оператор delete для базового указателя (Base *).
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;
}