7

我在嵌入式系统中使用了 C++ 基类和子类(为了清楚起见,我们称它们为 A 和 B)。

这是时间和空间的关键,所以我真的需要它是最小的。

编译器抱怨缺少虚拟析构函数,这是我理解的,因为如果你分配 aB* 然后删除指针作为A*.

但我永远不会分配此类的任何实例。有没有一种方法可以重载operator new(),以便在没有动态分配任一类的情况下进行编译,但如果最终用户尝试分配 A 或 B 的新实例,则会导致编译器错误?

我正在寻找一种与通过私有构造函数“毒化”自动编译器复制构造函数的常用技术类似的方法。(例如http://channel9.msdn.com/Forums/TechOff/252214-Private-copy-constructor-and-private-operator-C

4

3 回答 3

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();
}
于 2011-06-07T21:03:31.987 回答
2
class A
{
private:
    void *operator new(size_t);
    ...
};

省略号用于类的其他覆盖operator new和其余部分。

于 2011-06-07T21:04:15.450 回答
0

只需将 operator new 设为私有即可

于 2011-06-07T21:08:03.653 回答