立即学习:https://edu.csdn.net/course/play/9186/191705?utm_source=blogtoedu
//一:派生类对象模型的简述
//Men mymen; // 子类(派生类)对象 包含多个组成部分(也就是多个子对象)
(1) 一个是 含有派生类自己定义的成员变量 或者成员函数的子对象
(2) 一个是该派生类所继承的基类的子对象 ,这个子对象中包含的是基类中定义的成员变量
//Human* phuman = new Men; //基类指针 可以new派生类对象 因为派生类对象基础部分
// //换句话说 我们可以用基类指针new一个派生类对象
// //编译器帮助我们做了一个隐式转换
//
二:派生类构造函数
//Men mymen; //既调用基类构造函数 又调用派生类构造函数
//派生类实际是使用 基类的构造函数 ;
//B b(10, 12, 13); //先执行基类的构造函数 在执行派生类的构造函数
//先执行派生类的构造函数 再执行基类的构造函数
//三:既当父类又当子类
//class gra{...};
//class fa:public gra{..};//gra是fa的直接基类
//class son:public fa{...};//gra是son的间接基类(爷爷类)
//继承关系一直传递 构成了一种继承链
//四:不想当基类的类
//C++11标准 :final 加载类名后边
//五: 静态类型与动态类型
//Human* phuman = new Men();
//Human& q = *phuman;
//静态类型就是变量声明的类型 静态类型就是编译的时候是已知的
//动态类型:指的是这个指针/引用 所代表的 内存中的对象的类型。 这里是Men类型。
//动态类型 是运行时候才能知道
//动态类型: 静态类型这种概念 只有基类
//六: 派生类向基类的隐式类型转换
//Human* phuman = new Men;
//Human& q = *phuman;
//这种转换能够成功 是以为每个派生类对象都包含一个基类的 对象部分 所以基类的引用或者指针是可以
//基类对象 能独立存在 也能作为派生类对象的一部分存在
//并不存在派生类到基类的类型转换
//Men* phu = new Human;
//Men men;
//Human* phuman = &men;
Men* pmen = phuman; //不可以 编译器发现基类不能转成派生类
如果基类中有虚函数的话 可以通过dynamic_cast可以转换
//
//Men* pmen = dynamic_cast<Men*>(phuman);
//if (pmen != nullptr)
//{
// //{...}
//}
//父类与子类之间的拷贝与赋值
//Men men;
//Human human(men); //用派生类对象来定义并初始化基类对象 这个会导致基类的拷贝函数的执行
//赋值运算符
//Men men;
//Human human;
//human = men;
//结论
//用派生类对象为一个基类对象初始化或者赋值时 只有该派生类对象的