gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:03:14 24 4
gpt4 key购买 nike

我很好奇在下面的程序中 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;
}

最佳答案

对于你的代码,我不会推荐它,因为 Containerbase 的所有者,而引用,在语义上,意味着一些东西else(别名)。

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

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 析构函数,否则你会遇到尝试清理内存时的未定义行为区域。

关于c++ - 引用而不是指向抽象类的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12199374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com