有一个班级英雄。有时我需要一个深层复制(当所有成员都按值复制时)这个类作为一种派生类:
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 ++安全的?
谢谢,
答案 0 :(得分:4)
为什么不让派生类的构造函数使用基类的复制构造函数?
例如:
class SuperHero : public Hero
{
...
SuperHero(const Hero &hero) : Hero(hero) {
}
...
};
答案 1 :(得分:0)
这里我没有必要复制所有成员等。这样C ++是正确的,设计正确的还是C ++安全的?
让编译器尽可能多地执行此操作。对于每个成员,请确保它们具有适当的copy-ctors / op =等。如果有指针等,则需要深层复制。为此定义适当的copy-ctors / op = / dtors。
设计看起来有点偏差:
asSuperHero
这样的成员。这实际上应该作为派生类的成员来实现。asSuperHero
成员的动机不是很清楚。 但是当我改变Hero成员的数量时,我总是应该在SuperHero构造函数中改变他们的副本。
你能改写这部分吗?