引用而不是指向抽象类的指针

时间:2012-08-30 14:36:44

标签: c++ oop class object abstract-class

我很好奇是否可以将以下Base* base课程Container中的Base& base替换为Base base? 使用Base时,无法替换它,因为Base& base是抽象的 对于#include <iostream> class Base { public: virtual void str()=0; }; class A : public Base { int i; public: A(int i):i(i){} void str(){std::cout<<i<<std::endl;} }; class B : public Base { double f; public: B(double f):f(f){} void str(){std::cout<<f<<std::endl;} }; class Container { Base *base; public: Container(int i) { base=new A(i);} Container(double f) { base=new B(f);} void str(){ base->str();} }; int main () { Container c1(8),c2(13.0); c1.str(); c2.str(); return 0; } ,对象应该在某处分配,所以我仍然无法摆脱指向分配对象的指针。

{{1}}

1 个答案:

答案 0 :(得分:4)

使用您的代码,我不推荐它,因为Containerbase的所有者,而引用语义,意味着其他内容(别名)。

从技术上讲,没有什么能阻止你:

class Container
{   Base &base;
    public:
    Container(int i) : base(*new A(i))   {}
    Container(double f) : base(*new B(f)) {}
    void str(){ base->str();}
};

请注意,必须在初始化列表中初始化引用。

你仍然需要清理内存,看起来很丑陋:

~Container() { delete &base; }

而不是

~Container() { delete base; }

如果您使用指针。当然,使用std::unique_ptr代替这两者中的任何一个都会让生活变得更加轻松

此外,请务必实施(或声明为privatedeleted)复制构造函数或赋值运算符。

后期广告 - 您需要Base提供virtual析构函数,否则您将遇到未定义的行为区域我会试图清理记忆。