我知道这可能不是世界上最好的设计,但我对答案很感兴趣 没有任何实际原因。
假设我有两个带有重载新方法的类:
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。
有办法吗?
提前致谢!
答案 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 new
或Child::operator new
内使用。
要在不使用类/命名空间成员的情况下分配和初始化对象,请使用
::new Child
除此之外......是的,成员operator new
通常是严重的代码味道。