1.继承方式
私有继承 ,保护继承 公有继承
私有继承:
基类 派生类 对外接口
pulbic private 不可见
protect private 不可见
private 不可见 不可见
保护继承:
public protect 不可见
protect private 不可见
private 不可见 不可见
共有继承
pulbic public 可见
protect protect 不可见
private private 不可见
这是a kind of关系
Base 假设成人
Derive 假设成学生
不能把人赋值给学生,学生会写作业,但是不是所有人都会写作业
可以把学生赋给人,人会吃饭,学生也会吃饭,就是人会做的事情,学生也会做
基类指针->派生类 它只能访问基类部分
如果是没有虚函数的情况,基类和派生类的同名函数是隐藏,而且这时候call 的Base方法,因为编译期间就看见是
Base类,就直接去Base中找我们要的方法。地址就被确定下来了。
2.重载 隐藏 覆盖
重载
目的是多态
函数重载,函数名相同,函数类型不同,形参类型不同,形参个数不同,形参顺序不同。作用域相同
隐藏
在基类和派生类集成结构中,派生类的同名成员把基类同名成员给隐藏了
覆盖
基类和派生类继承结构中,返回值,函数名,参数列表都相同,而且基类的该函数是virtual函数,那么派生类的函数也是virtual函数了。这就是覆盖关系。
虚函数
inline 函数编译时候展开代码,没有函数地址,可是其实
构造函数是构造对象的,我们知道ptr指针一般是在构造函数里第一行执行生成的,我们都没有ptr,怎么去虚表里找呢
构造函数不能写成虚函数
ptr一般是在构造函数的第一行里生成,但是没有对象生成,或者说你构造函数本身去构造ptr指针,问你怎么去用ptr指向构造函数。
静态函数不能写成虚函数
不能写成虚函数,因为静态成员函数调用约定不是this_call 调用约定
虚析构,析构函数是可以写成虚函数的
(1)如果父类的析构函数不加virtual关键字
当父类的析构函数不声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数。
(2)如果父类的析构函数加virtual关键字
当父类的析构函数声明成虚析构函数的时候,当子类继承父类,父类的指针指向子类时,delete掉父类的指针,先调动子类的析构函数,再调动父类的析构函数。
Base b;
Derive *pd = static_cast<Derive *>(&b);
pd->show(); //基类和派生类都有不带show,这里是用什么show方法是基类的
派生类指针不能指向基类的指针
通过强转之后,去处理这个问题。但是这时候,还是看你指向的对象就用谁的虚表,而不是关注指针的类型
动多态是否破坏了封装性
我想着多态是否有破坏封装性呢。访问限定只是在语法上限定,意味着在编译期间限定,但是动多态是在运行阶段时候call寄存器。我们如果把派生类私有成员里放置了一个show方法,然后在Base 中public也有个show方法,然后Base指针指向一个派生类
调用show方法,最后调用派生类的show方法,这个时候那么说是否破坏了它的封装性呢?