我很好奇是否可以将以下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}}
答案 0 :(得分: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; }
如果您使用指针。当然,使用std::unique_ptr
代替这两者中的任何一个都会让生活变得更加轻松。
此外,请务必实施(或声明为private
或deleted
)复制构造函数或赋值运算符。
后期广告 - 您需要为Base
提供virtual
析构函数,否则您将遇到未定义的行为区域我会试图清理记忆。