2010-02-15 60 views
0

有一个班级英雄。有时候,我需要这个类的深层副本(当所有成员被复制值)作为一种一些派生类:是否将“this”向下派生为派生类是正确的?

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

更明显的方法是实现超级英雄构造这需要所有成员,做他们的副本手动(因为C++中没有派生类的拷贝构造函数):SuperHero(member1,member2,...)(这种)。但是当我更改Hero成员的数量时,我总是会在SuperHero构造函数中更改它们的副本。

为了避免这一点,我将通过以下方式实现asSuperHero():

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

在这里,我也没有必要对所有成员复制等是这款C方式++正确,设计corrent和C++安全吗?

感谢,

+0

你真的想在这里实现什么?你有一个'SuperHero'存储在一个指向'Hero'的指针并且想要沮丧吗?还是你有一个'Hero'对象,你想用它来创建一个新的'SuperHero'实例? –

+0

@David:第二个 - “有一个你想用来创建一个新的SuperHero实例的英雄对象?” – bjilly

回答

4

为什么不只是派生类的构造函数中使用的基类的拷贝构造函数?

如:

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

不知道此功能。一定会尝试它!谢谢。 – bjilly

+0

@ bjilly - 如果复制构造函数未被Laurence提及,则编译器将调用基类[Hero]的默认构造函数,而不是调用基类的Copy Constrcutor。正如你可以改变类英雄,如果你没有一个,添加一个拷贝构造函数。我相信劳伦斯的答案就是你要找的。 –

0

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

让编译器做到这一点,就像你可以。对于每个成员,确保他们有适当的copy-ctors/op =等等。当你有指针时需要进行深层复制等。为此定义合适的copy-ctors/op =/dtors。

设计看起来有点过:

  • 基类应具有虚拟dtors /构件
  • 基类应该是无视像asSuperHero构件。这确实应该作为派生类的成员来实现。
  • 拥有asSuperHero成员的动机不是很清楚。

但是,当我改变英雄的成员数量,我送花儿给人应该会在超级英雄的构造改变他们的副本。

你能改写这个部分?

+0

>你能改写这部分吗? 我的意思是在SuperHero构造函数(1)中有显式成员复制的情况。当我更改添加/删除新成员给英雄时,我会一直更改构造函数(1):有两个责任点。我想把它们减少到一个。 – bjilly

+0

@bjilly:不,只要基类_big three_正确实现,向基类添加数据成员就不需要对派生类进行任何更改。另外,在基类中使成员函数为'virtual'。 – dirkgently