Effective C++ 条款39
2016-02-16 15:18
387 查看
我从本条款中学到了下面内容:
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语言笔试经典--求分数数列的和
- C语言笔试经典--求分数数列的和
- C语言笔试经典--求分数数列的和
- c++下使用命名管道实现进程间通信
- C语言字节对齐(以32位系统为例)
- 翻转句子中单词的顺序 C语言
- C语言笔试经典-查找多位数重复数字以及次数
- C语言笔试经典-查找多位数重复数字以及次数
- C语言笔试经典-查找多位数重复数字以及次数
- c++四种类型转换
- C++string的replace函数
- c++ vilatile
- 解析C语言基于UDP协议进行Socket编程的要点
- ZeroMQ研究与应用分析
- c++下使用邮槽实现进程间通信
- leetcode231题 题解 翻译 C语言版 Python版
- CV限制符--C++
- Windows系统下使用C语言编写单线程的文件备份程序
- c++虚基类
- c语言入门之项目1.4——指针变量2