我是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;
}
我阅读了cpp-reference page中的名称查找规则,但是没有找到关于为什么找到基类中定义的new运算符并将其用于派生类(可能包含其他成员)的任何解释。 / p>
在基类中声明operator new
然后使用它为派生类分配内存(这是从一些用C ++编写的开源项目中提取的)是一种常见的方法吗?
答案 0 :(得分:4)
在正在创建的类(在本例中为operator new
)的范围内“查找”分配函数SomeClass
。当您在类范围内查找名称时,它可以找到该名称作为基类的成员。这就是这种情况。
也许您想知道为什么operator new
的查找没有使用一些特殊的规则,从而排除了基类成员。好吧,我认为在某些情况下使用基类operator new
是有意义的。派生类可能包含其他成员这一事实本身并不会引起问题,因为该语言会将派生的类的大小传递给operator new
,从而确保它知道它必须为派生的类对象分配多少内存。并且使用基类operator new
可以从CRTP基类引入该运算符,或者只是为从同一个池中分配派生类提供一种简便的方法。