【问题标题】:reference instead of pointer to abstract class引用而不是指向抽象类的指针
【发布时间】:2012-08-25 07:53:35
【问题描述】:

我很好奇在下面的程序中Container 类中的Base* base 是否可以替换为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;  
}

【问题讨论】:

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


【解决方案1】:

我不推荐使用您的代码,因为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 析构函数,否则当您尝试清理时会遇到未定义的行为领域增加内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2010-12-02
    • 1970-01-01
    • 2017-04-26
    相关资源
    最近更新 更多