将'this'向下转换为派生类是正确的吗?

时间:2010-02-15 07:27:39

标签: c++

有一个班级英雄。有时我需要一个深层复制(当所有成员都按值复制时)这个类作为一种派生类:

class Hero
{
    public:
        // members, w/o getters/setters
    public:
        // Constructors
        Hero();
        Hero(...)
        ~Hero();

        inline SuperHero* asSuperHero() {
             // Here should be retured SuperHero instance initialized with all members of Hero class
        }
};

class SuperHero : public Hero
{
    private:
        // Shouldn't be instantianed manually
        SuperHero();

    public:
        // This class-only specific method
        void helpAround();
};

更明显的方法是实现SuperHero构造函数,该构造函数接受所有成员并手动复制(因为C ++中没有用于派生类的复制构造函数):SuperHero(member1,member2,...)(种类) 。但是,当我改变Hero成员的数量时,我总是会在SuperHero构造函数中改变他们的副本。

为了避免这种情况,我将以下列方式实现asSuperHero():

inline SuperHero* asSuperHero() {
     return static_cast<SuperHero *>(this);
}

这里我没有必要复制所有成员等。这样C ++是正确的,设计正确的还是C ++安全的?

谢谢,

2 个答案:

答案 0 :(得分:4)

为什么不让派生类的构造函数使用基类的复制构造函数?

例如:

class SuperHero : public Hero
{
    ...
        SuperHero(const Hero &hero) : Hero(hero) {
        }
    ...
};

答案 1 :(得分:0)

  

这里我没有必要复制所有成员等。这样C ++是正确的,设计正确的还是C ++安全的?

让编译器尽可能多地执行此操作。对于每个成员,请确保它们具有适当的copy-ctors / op =等。如果有指针等,则需要深层复制。为此定义适当的copy-ctors / op = / dtors。

设计看起来有点偏差:

  • 基类应该有虚拟dtors /成员
  • 基类应该忽略像asSuperHero这样的成员。这实际上应该作为派生类的成员来实现。
  • 拥有asSuperHero成员的动机不是很清楚。
  

但是当我改变Hero成员的数量时,我总是应该在SuperHero构造函数中改变他们的副本。

你能改写这部分吗?