重载新的运算符和继承

时间:2012-03-28 04:53:30

标签: c++ operator-overloading new-operator

我知道这可能不是世界上最好的设计,但我对答案很感兴趣 没有任何实际原因。

假设我有两个带有重载新方法的类:

class Base {
public:
operator void* new(size_t);
};

class Child : public Base {
public:
operator void* new(size_t); //THIS, i would like this to be the "original" new.
};

operator void* Base::new(size_t) {
//...
return new Child;
//...
}

我希望Child :: new能像原版一样工作,所以我可以避免使用malloc。

有办法吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

这不是一个正确的设计。应该operator new函数 返回原始内存,而不是构造对象。如果你的目标是 调用new Base实际上创建了一个新的Child,它不可能 用C ++完成;通常的解决方案是提供工厂方法 Base;例如:

class Base
{
    //  Ban the expression `new Base`...
    void* operator new(size_t);
protected:
    virtual ~Base();  //  Ban instances on the stack.

public:
    static Base* create(/*...*/);
    //  ...
};

然后在源文件中:

class Child : public Base
{
    //  ...
};

Base* Base::create(/*...*/)
{
    return ::new Child(/*...*/);
}

(请注意,私有operator new并不完全禁止客户端代码 使用new运算符,因为人们总是可以写::new Base。)

除声明私人operator new禁止直接分配外, operator new成员的唯一用途是从a分配实例 特定池;在这种情况下,您还需要一名成员operator delete 将它们释放到池中的功能。

答案 1 :(得分:0)

您始终可以使用语法

访问全球 operator new
return ::operator new( sizeof Child );

注意一元范围运算符。此语法忽略任何类和名称空间成员,并且可以在Base::operator newChild::operator new内使用。

要在不使用类/命名空间成员的情况下分配和初始化对象,请使用

::new Child

除此之外......是的,成员operator new通常是严重的代码味道。