C++ 重载新运算符和继承
我知道也许这不是世界上最好的设计,但我对答案很感兴趣 没有任何实际理由 假设我有两个重载了新方法的类:C++ 重载新运算符和继承,c++,operator-overloading,new-operator,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(
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像最初的new一样工作,这样我就可以避免使用malloc
有办法吗
谢谢你 您始终可以使用以下语法访问全局运算符new
return ::operator new( sizeof Child );
请注意一元范围运算符。此语法忽略任何类和命名空间成员,并将在Base::operator new
或Child::operator new
中工作
要在不使用类/命名空间成员的情况下分配和初始化对象,请使用
::new Child
除此之外……是的,新成员
操作员通常是一种严重的代码气味。这不是一种正确的设计。操作员新的
功能应该
返回原始内存,而不是构造的对象。如果你的目标是
调用new Base
来创建一个新的子项
,它不能
在C++中完成;通常的解决方案是在
Base
;e、 g:
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(/*...*/);
}
(请注意,私有的操作员new
并没有完全禁止客户端代码
从使用new
操作符开始,因为人们总是可以编写::new Base
)
除了宣布新的私有运营商
以禁止直接分配,
operator new
成员的唯一用途是从
特定池;在这种情况下,您还需要一个成员操作员delete
函数将它们释放到池中。这可能会对您有所帮助……我认为您的Base::operator new
不会真正“起作用”(例如,每次构建子对象时,它都不会被销毁)。有鉴于此,很难说出您想要Child::operator new
做什么。你确定你不是在寻找工厂函数吗?好的读物:。我无法理解您要实现的目标,因此我不想将此标记为重复,我确实有一种感觉,这就是您要寻找的。我建议您致电操作员new
。为什么会员操作员new
是个问题?例如,这是一种确保类使用内存池的简单方法。(显然,操作符new
、成员或其他成员不应使用new
操作符,因为它的作用是返回原始内存,而不是构造对象。)@Potatoswatter这不是标准所说的。当您需要类特定的运算符new
函数时,它必须是类的成员或类的基类。您必须提供相应的运算符delete
函数。@JamesKanze-Nah,我错了,最好使用成员放置运算符new
来分派给分配器。否则,用户可能会意外地使用另一个分配器。尽管如此,它仍然以另一种方式工作,甚至包括placement delete。@Potatostater注意placement delete。它仅用于new
表达式中的构造函数抛出的特殊情况。在new
表达式中使用的运算符new
函数没有被记忆。哦,我明白了。看起来我误解了这是为什么。