Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载新运算符和继承_C++_Operator Overloading_New Operator - Fatal编程技术网

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
函数没有被记忆。哦,我明白了。看起来我误解了这是为什么。