1

我很好奇是否可以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;  
}
4

1 回答 1

4

使用您的代码,我不推荐它,因为Container它的所有者base和引用在语义上意味着其他东西(别名)。

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

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; }

如果您使用指针。当然,使用 astd::unique_ptr而不是这两个中的任何一个都会让生活变得更轻松

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

稍后发现- 您需要提供Base一个virtual析构函数,否则当您尝试清理内存时会遇到未定义的行为领域。

于 2012-08-30T14:39:44.940 回答