标签:
最近阅读Mitsuba的架构,有一个挺有意思的设计,开始没看明白。搜了下资料才搞懂。
有一个基类Object,它的析构函数是protected访问权限的。并且,所有继承Object的类,都需要实现一个自己的protected的析构函数。
Mitsuba还特意解释了,这是为了防止在stack上构建Object的对象。
这是怎么回事呢?
”编译器在为类对象分配栈空间时,会先检查类的析构函数的访问性,其实不光是析构函数,只要是非静态的函数,编译器都会进行检查。如果类的析构函数是私有的,则编译器不会在栈空间上为类对象分配内存。“
采用protected的目的是为了能够让类能够正常的被继承。但是!要保持子类也不能在栈上申请对象,必须保持子类的析构函数也是protected/private(若是private子类不能被继承,更多信息查看 http://www.cnblogs.com/wangpei0522/p/4460425.html)
为什么new可以呢?
我们知道new是C++的一个操作符,实际上,operator new是类对象的一个成员函数,所以能够正常的申请对象。
与防止在stack上构建对象的设计所对应的方案是
防止在heap上构建对象
有了上面的基础,你肯定能立马想到设置operator new()的访问权限设置为protected/private
标签:
原文地址:http://www.cnblogs.com/wangpei0522/p/4542223.html