【发布时间】:2018-05-30 15:17:47
【问题描述】:
搜索了几个小时后,我终于到了这里。我有一个 Container 类,其中有一个指向 Base 类的指针作为成员变量。这应该引用 Spec1 或 Base 的另一个继承类,我在这里省略了。类型应由构造函数中的参数确定(例如 string、enum、int 等)。
我阅读了很多关于动态内存分配以及为什么应尽可能避免使用它的信息。这里可以避免吗?在构造函数之后是否有任何常用对象被销毁?还是设计理念完全错误?我来自 Java :( 在此先感谢。
class Base{
public:
virtual ~Base(){}; // required?
virtual void doSomething() = 0;
};
class Spec1 : public Base {
public:
Spec1(){};
Spec1(int i){
// whatever
}
void doSomething(){
std::printf("hello world");
}
};
class Container{
public:
Container(String type_message){
if (type_message.compare("We need Spec1")){
m_type = new Spec1(1);
} // add more ifs for other types (Spec2, Spec3 etc.)
}
void doSomethingWithSpec(){
m_type->doSomething();
}
private:
Base* m_type;
};
int main (int argc, char **argv){
Container a ("We need Spec1");
a.doSomething();
}
【问题讨论】:
-
建议在您的情况下使用
std::unique_ptr和std::make_unique,而不是原始指针和new。 -
您的设计总体上很好,尽管
Container缺少调用delete m_type;的析构函数(并且还应该禁用默认的复制构造函数和复制赋值运算符,因为不应复制m_type原样)。是的,~Base必须是virtual,所以delete m_type;可以正常工作,调用您选择实例化的任何派生类型的析构函数。 -
如果程序被 ctrl-c(ubuntu 终端)中止,是否会调用析构函数?还是我必须手动调用析构函数?
-
关于“尽可能避免”动态分配,这是真的,但如果你想在 C++ 中实现多态性,那么你必须使用指针或引用,所以在这种情况下(即如果引用不合适)您将需要使用动态分配。
标签: c++ pointers inheritance member