我在我的嵌入式系统中使用了C ++基类和子类(为了清晰起见,我们称之为A和B)。
这对时间和空间至关重要,所以我真的需要它是最小的。
编译器抱怨缺少虚拟析构函数,我理解,因为如果你分配B*
并稍后将指针删除为A*
的实例,那么会让你陷入麻烦。
但我永远不会分配这个类的任何实例。有没有办法我可以重载operator new()
,如果没有动态分配任何一个类,它会编译,但如果最终用户试图分配A或B的新实例,会导致编译器错误?
我正在寻找一种类似于通过私有构造函数“中毒”自动编译器拷贝构造函数的常用技术的方法。 (例如http://channel9.msdn.com/Forums/TechOff/252214-Private-copy-constructor-and-private-operator-C)
答案 0 :(得分:9)
您可以使用与复制构造函数相同的方式来毒害operator new
。请确保不要毒害新的位置。虚拟析构函数仍然是一个很好的推荐。
int main() {
char data[sizeof(Derived)];
if (condition)
new (data) Derived();
else
new (data) Base();
Base* ptr = reinterpret_cast<Base*>(&data[0]);
ptr->~Base();
}
答案 1 :(得分:2)
class A
{
private:
void *operator new(size_t);
...
};
elipses用于operator new
和其他同类的其他覆盖。
答案 2 :(得分:0)
让运营商新私有