class 是否可以包含一个 Base class 作为成员,后者后来专门用于 Derived class?
Can a class contain as a member a Base class which is later specialized to a Derived class?
我可以有一个 class ("BIG"),它有另一个 class 作为成员("Base" 类型),以便在构建时,这个 "Base" 成员实际上将被设置为派生的 class?
我特别想要
class Base{
public:
void dostuff(){};
};
class DerivedA : public Base{
public:
void dostuff(){
//implementation version A
}
};
class DerivedB : public Base{
public:
void dostuff(){
//implementation version B
}
};
class BIG{
Base mything;
BIG(int Type){
if (Type==0)
mything=DerivedA();
if (Type==1)
mything=DerivedB();
}
};
难道C++不允许这样吗。特别是,我会 "Downcasting" 从 Base 神话到 DerivedA 或 DerivedB。我是否正确,仅允许从 Base pointers 到 Derived pointers 向下转换,并且仅当 Base 指针实际上已经是指向 Derived class?
首先,您可能忘记了实际派生自 Base
。但无论如何,多态性需要指针或引用。否则,将派生 class 的对象分配给基 class 类型的变量将 "slice" 派生 class 对象,即它将切割基 class 派生出的对象 class 对象:
class Base{
public:
virtual void dostuff(){ cout << "in base" << endl; };
};
class DerivedA : public Base {
public:
virtual void dostuff(){ cout << "in derived" << endl; };
};
int main() {
Base mything = DerivedA(); // slicing, will result in a `Base`-object
mything.dostuff(); // Base class implementation
Base *polymorph = new DerivedA(); // polymorphic; will point to a DerivedA-instance
polymorph->dostuff(); // DerivedA class implementation of dostuff
}
是的,这是可能的,但神话必须是指针或对多态对象的引用。如果你将它作为一个普通对象保存,你会得到 slicing。
class BIG{
Base *mything;
public:
BIG(int Type){
if (Type==0)
mything = new DerivedA();
else if (Type==1)
mything = new DerivedB();
}
};
当然,这假设 DerivedA
和 DerivedB
都公开继承自 Base
。如果你想调用正确的 dostuff()
函数,你还需要使它成为 virtual
(这不是针对你的问题,而是针对多态 classes),以及一个虚拟析构函数。
最后,如果您不想遇到令人讨厌的 allocation/deallocation 错误,则需要注意 rule of 3。因此,更方便的替代方法是使用智能指针而不是原始指针,并让智能指针负责复制和销毁。
评论:这是一个风格问题,这里无关紧要,但尽量养成良好的习惯,避免全大写class name ;-)
我可以有一个 class ("BIG"),它有另一个 class 作为成员("Base" 类型),以便在构建时,这个 "Base" 成员实际上将被设置为派生的 class?
我特别想要
class Base{
public:
void dostuff(){};
};
class DerivedA : public Base{
public:
void dostuff(){
//implementation version A
}
};
class DerivedB : public Base{
public:
void dostuff(){
//implementation version B
}
};
class BIG{
Base mything;
BIG(int Type){
if (Type==0)
mything=DerivedA();
if (Type==1)
mything=DerivedB();
}
};
难道C++不允许这样吗。特别是,我会 "Downcasting" 从 Base 神话到 DerivedA 或 DerivedB。我是否正确,仅允许从 Base pointers 到 Derived pointers 向下转换,并且仅当 Base 指针实际上已经是指向 Derived class?
首先,您可能忘记了实际派生自 Base
。但无论如何,多态性需要指针或引用。否则,将派生 class 的对象分配给基 class 类型的变量将 "slice" 派生 class 对象,即它将切割基 class 派生出的对象 class 对象:
class Base{
public:
virtual void dostuff(){ cout << "in base" << endl; };
};
class DerivedA : public Base {
public:
virtual void dostuff(){ cout << "in derived" << endl; };
};
int main() {
Base mything = DerivedA(); // slicing, will result in a `Base`-object
mything.dostuff(); // Base class implementation
Base *polymorph = new DerivedA(); // polymorphic; will point to a DerivedA-instance
polymorph->dostuff(); // DerivedA class implementation of dostuff
}
是的,这是可能的,但神话必须是指针或对多态对象的引用。如果你将它作为一个普通对象保存,你会得到 slicing。
class BIG{
Base *mything;
public:
BIG(int Type){
if (Type==0)
mything = new DerivedA();
else if (Type==1)
mything = new DerivedB();
}
};
当然,这假设 DerivedA
和 DerivedB
都公开继承自 Base
。如果你想调用正确的 dostuff()
函数,你还需要使它成为 virtual
(这不是针对你的问题,而是针对多态 classes),以及一个虚拟析构函数。
最后,如果您不想遇到令人讨厌的 allocation/deallocation 错误,则需要注意 rule of 3。因此,更方便的替代方法是使用智能指针而不是原始指针,并让智能指针负责复制和销毁。
评论:这是一个风格问题,这里无关紧要,但尽量养成良好的习惯,避免全大写class name ;-)