指向基类数组的指针,填充派生类
Pointer to array of base class, populate with derived class
如果我有一个基类,只有虚拟方法和2个派生的类基类,并实现了这些虚拟方法。
我如何:
// causes C2259
BaseClass* base = new BaseClass[2];
BaseClass[0] = new FirstDerivedClass;
BaseClass[1] = new SecondDerivedClass;
或:
// causes "base is being used without being initialized"
BaseClass* base;
// causes CC59 again
BaseClass* base = new BaseClass;
base[0] = FirstDerivedClass();
base[1] = SecondDerivedClass();
(或类似的东西)
...以便我可以通过DerivedClass
访问BaseClass
S方法但是指针和指针是DerivedClass
S?
您的数组是错误的类型:它存储BaseClass
对象 Instances 而不是 pointers 向它们存储。由于BaseClass
似乎是抽象的,因此编译器抱怨它不能默认构造实例填充您的数组。
即使BaseClass
不是抽象的,使用阵列在C 中使用阵列是一个很大的禁忌,因此无论如何,您都应该做不同的事情。
通过将代码更改为:
来解决此问题BaseClass** base = new BaseClass*[2];
base[0] = new FirstDerivedClass;
base[1] = new SecondDerivedClass;
也就是说,在大多数情况下,最好使用std::vector
代替普通阵列和智能指针(例如std::shared_ptr
)而不是愚蠢的指针。使用这些工具而不是手动编写代码将以极小的运行时间成本透明地处理许多问题。
它是C 使用std::vector
而不是简单的数组:
std::vector<BaseClass*> base;
base.push_back(new FirstDerivedClass());
base.push_back(new SecondDerivedClass());
正如Kerrek SB
注意的最安全方法是使用std::unique_ptr
:
std::vector<std::unique_ptr<BaseClass> > base;
base.push_back( std_unique_ptr<BaseClass>(new FirstDerivedClass()) );
base.push_back( std_unique_ptr<BaseClass>(new SecondDerivedClass()) );
如果您的基本拉有纯虚拟方法,这将无法编译:
BaseClass* base = new BaseClass[2];
如果没有,您将获得内存泄漏。
在C 中,这是通过使用STD :: Vector或STD :: Array和某种智能指针来完成的。例如:
std::vector< std::shared_ptr< BaseClass > > arr( 2 );
arr[0].reset( new FirstDerivedClass() );
arr[1].reset( new SecondDerivedClass() );
这是答案(来自rubby)
BaseClass* Base[2];
Base[0] = new FirstDerivedClass;
Base[1] = new SecondDerivedClass;
定义指针阵列,指针类型是基础。并将指针分配给派生频道为数组的元素。就像:
BaseClass* base [2];
base[0] = new FirstDerivedClass;
base[1] = new SecondDerivedClass;
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 在c++中用vector填充一个简单的动态数组
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何使用用户输入在C++中正确填充2D数组
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 如何委托派生类使用其父构造函数?
- 如何找到大小'x'数组是否完全填充,在C++?
- 如何使用单独文件中的派生类访问友元函数对象
- 派生类销毁的最佳实践是什么
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 基类的填充将被复制到派生类中
- 如何使用数据成员填充派生类的对象到基类的指针数组中
- 用于填充 Base 和派生对象的 shared_ptr 向量的函数模板
- 如何填充循环模板派生类的静态成员
- 指向基类数组的指针,填充派生类
- C++-填充派生类数据成员,同时设置基类属性值
- 用派生类填充基类类型的2D矢量
- Gcc /clang在基结构的后填充中布局派生结构的字段
- 使用派生类构造函数填充基类受保护成员