展示位置运算符新查询

时间:2019-06-18 20:43:10

标签: c++ new-operator name-lookup

我是C ++的新手,对以下示例感到困惑:

#include <iostream>
#include <cstddef>
#include <cstdlib>

class Test{
public:
    enum test_type{ test1 = 0, test2, test3};
    void *operator new(size_t sz, test_type t){
        return malloc(sz);
    }
};

class SomeClass: public Test{
public:
    SomeClass(int a): a(a){}
    int a;
};

int main(int argc, char ** argv){
    SomeClass *sc = new(Test::test1) SomeClass(10);
    std::cout << sc->a << std::endl;
}

DEMO

我阅读了cpp-reference page中的名称查找规则,但是没有找到关于为什么找到基类中定义的new运算符并将其用于派生类(可能包含其他成员)的任何解释。 / p>

在基类中声明operator new然后使用它为派生类分配内存(这是从一些用C ++编写的开源项目中提取的)是一种常见的方法吗?

1 个答案:

答案 0 :(得分:4)

在正在创建的类(在本例中为operator new)的范围内“查找”分配函数SomeClass。当您在类范围内查找名称时,它可以找到该名称作为基类的成员。这就是这种情况。

也许您想知道为什么operator new的查找没有使用一些特殊的规则,从而排除了基类成员。好吧,我认为在某些情况下使用基类operator new是有意义的。派生类可能包含其他成员这一事实本身并不会引起问题,因为该语言会将派生的类的大小传递给operator new,从而确保它知道它必须为派生的类对象分配多少内存。并且使用基类operator new可以从CRTP基类引入该运算符,或者只是为从同一个池中分配派生类提供一种简便的方法。