不使用dynamic_cast

时间:2017-05-02 20:33:38

标签: c++

有一个抽象类BasePet和一些子类。我想做一个功能

BasePet* foo(BasePet*);

将使对象的副本从静态内存复制到堆。除了使用dynamic_cast之外还有什么方法吗? (例如,如果可能有另外一个我不知道的子类,我希望foo()可以用于所有这些类。)

1 个答案:

答案 0 :(得分:1)

如果您可以修改BasePet及其派生类,则典型的方法是在clone中创建BasePet方法,并要求每个派生类覆盖它。通常这看起来像:

/*
This is what BasePet::clone() would look like if you wrote it, but normally that would be pure virtual.    

BasePet *BasePet::clone() const
{
    return new BasePet(*this);
}
*/

BasePet *Dog::clone() const
{
    return new Dog(*this);
}

BasePet *Cat::clone() const
{
    return new Cat(*this);
}

// ... and so on ...

如果您无法访问类实现,我的第一个建议是尝试找出一种方法来执行您尝试执行的操作而不复制对象,因为您提出了关于新派生的问题出现的类,以及类的实现以可能影响代码需要做的方式改变。如果没有办法解决它,你需要使用某种形式的运行时类型识别(RTTI);我会使用typeid而不是dynamic_cast,以便您可以测试完全匹配,如果派生类D本身是另一个派生类的基类,则不会被绊倒{ {1}}你不知道的。