1.对象
1.赋值
1.基类对象可以赋值给派生类吗?
可以 因为派生类有基类对象的成员
2.派生类对象可以赋值给基类吗?
不可以 因为派生类有基类没有的成员
2.成员函数调用
1.基类
基类的成员函数调用和一般的类是一样的
2.派生类
1.构造函数
1.先构造它继承过来的类
2.再构造派生类本身自己
2.析构函数
在析构的时候
1.先析构派生类自己的类
2.再析构继承过来的类
3.拷贝构造
1.派生类拷贝派生类
在拷贝构造的时候
1.先拷贝构造它继承过来的类
2.再拷贝构造派生类本身自己
2.基类拷贝派生类
1.直接调用基类的拷贝对象
4.赋值重载
1.派生类赋值给派生类
在赋值重载的时候
1.先调用基类的赋值重载
2.再实现派生类自己的(这个地方是是实现不是调用 如果是调用就是无限递归)
2.基类赋值给派生类
直接调用基类的的拷贝对象
5.const 取地址运算符和非 const 取地址运算符
const取地址符和非const取地址符 派生类都是调用它自己的 不会去调用基类的
因为一个类只有一个地址
2.指针(引用同理)
1.基类对象取地址可以赋值给派生类指针吗?
直接赋值是不可以的
特殊情况可以 后面介绍
2.派生类对象取地址可以赋值给基类指针吗?
可以 这涉及到切片 也就是把派生类中的基类对象那部分取地址赋值过去
基类指针只 “认识” 基类的成员 所以基类指针指向的是派生类中基类的那部分
派生类对象取地址赋值给基类指针 对这个指针* 调用的成员函数是基类的(比如基类的赋值重载)
指向的派生类对象(其中的基类部分)
但是类型是基类指针
(. ->)只能访问基类的成员 不能访问派生类的
总结:
本质上这个地方就是一个基类的指针
指向的是一个基类对象(派生类的基类部分单独看 看成一个基类)
访问也只能访问基类的东西 只不过 这个基类是在派生类内部罢了!
总结:继承 只是继承这个类 相当于把基类装到派生类里面 基类内部的结构不变
基类成员初始化用的也是基类的析构函数 销毁也是基类的析构函数 继承 类比理解
就是基类是派生类的一个成员变量 只不过这个成员的类型不是内置类型 而是自定义类型
同时内置类型初始化和销毁不需要特殊处理 编译器会帮我们处理 比如说 int a; 但是自定义类型的 初始化和销毁需要我们自己来实现
所以我么们对象切片的时候 相当于把派生类的一个类型单独拿出来 只不过这个类型是自定义类型 这个派生类的对象 当然无法通过它访问派生类其他成员和函数了(它和派生类其他变量是同级的 只不过它是先声明/继承来的)