Effective C++ 条款39
2015-06-03 09:27
323 查看
我从本条款中学到了以下内容:
1.private继承不同于另外两种继承,派生类对象不能隐式转换为基类对象。如下代码:
编译器明确指出基类是不可访问的,所以转换失败。private继承在基类和派生类之间已经没有所谓的继承关系,之所以有它的存在纯粹是为应用层面服务,即为了编程的灵活性而存在的继承关系。
2.如下代码,告诉我们private调用的好处,当存在一种特殊情况时,即base class 大小为空时,调用private继承可以使派生类占据的空间大小最小化。这时有人会说我定义的类不是空,为什么大小为1个字节,这里简单解释下。任何一个类的大小都不为空,即使你这样定义
class m{};这个类的大小依然为1,类的大小只和变量有关,并且变量是非静态变量,静态变量不影响类的大小。
1.private继承不同于另外两种继承,派生类对象不能隐式转换为基类对象。如下代码:
class Bird//鸟 { }; class ostrich:private Bird//鸵鸟 { }; int main() { Bird *b = new ostrich();//编译不通过,基类不能转换为派生类 }
编译器明确指出基类是不可访问的,所以转换失败。private继承在基类和派生类之间已经没有所谓的继承关系,之所以有它的存在纯粹是为应用层面服务,即为了编程的灵活性而存在的继承关系。
2.如下代码,告诉我们private调用的好处,当存在一种特殊情况时,即base class 大小为空时,调用private继承可以使派生类占据的空间大小最小化。这时有人会说我定义的类不是空,为什么大小为1个字节,这里简单解释下。任何一个类的大小都不为空,即使你这样定义
class m{};这个类的大小依然为1,类的大小只和变量有关,并且变量是非静态变量,静态变量不影响类的大小。
#include<string> #include<iostream> using namespace std; class Bird//鸟 { public: static string name; static string getName(){ return name; } }; class ostrich:private Bird//鸵鸟 { }; int main() { int m1 = sizeof(Bird);//m1大小为1个字节 int m2 = sizeof(ostrich);//m2大小也为1个字节 }
相关文章推荐
- C语言程序设计(第4版)
- YTU 2755: C++习题-希尔排序
- C++之我是二代我继承——圆与线
- C++之容器
- 解决vs2010中C++的cout使用问题
- C++刷题——2830: 递归求1*1+2*2+3*3+……+n*n
- 《爱编程爱C++第9期-第二章-C++简单程序设计-上》
- c++ 多线程中的线程同步--Event
- C++刷题——2802: 判断字符串是否为回文
- C语言之第六章 常量 宏 函数
- C++刷题——2736: 指针练习--输出最大值
- C++之我是二代我继承——日期时间
- c++哈希与容器
- C++之我是二代我继承——摩托车=自行车+机动车
- C语言中声明和定义的区别——分析extern关键词。
- C++中引用(&)的用法和应用实例
- C++中引用(&)的用法和应用实例
- C++之我是二代我继承——教师干部
- C++刷题——2707: 素数与因子
- 精通 C++ 是个毛意思