C++day6
子类的构造、析构、拷贝
执行构造时按顺序先执行父类构造
执行析构时,先把自己释放,再释放父类、祖父。。。
delete掉void*类型可能会导致无法调用析构函数
子类对象初始化新的子类对象,会自动调用父类缺省构造,再调用自己的缺省构造
子类调用拷贝构造,需要显式调用父类拷贝构造,否则会调用父类无惨构造
私有继承、保护继承
private
子类用private继承父类,public成员会变成private,是为了防止父类成员扩散
可调用的情况
1、该成员函数 2、友元函数
protected
子类用protected继承父类,public成员会变成protected,是为了防止父类成员扩散
可调用的情况
1、该成员函数 2、友元函数 3、他作为父类声明的子类
多重继承、钻石继承、虚继承
多重继承
一个子类有多个父类,继承表按照顺序继承所有父类的属性,按照顺序调用所有父类的构造
子类中会标记每个父类的存储位置
子类指针转换成父类的隐式指针时,编译器自动计算父类中内存所在子类中的位置,地址会自动进行偏移计算
名字冲突
父类中同名成员,可正常继承,但使用时需要(类名::成员名)
钻石继承
继承关系构成了菱形
访问祖先类中的成员需要(类名::成员名)
虚继承
virtual
钻石继承时会造成冗余,使用虚继承可使内容只保留一份
由子类覆盖父类,所以相同函数会在最早的祖先类中被声明,会被之后的子类覆盖,所以子类可以调用函数,但实际的内存却在祖先类中。
虚函数、覆盖、多态
虚函数
virtual修饰
覆盖
子类覆盖父类虚函数
多态
子类覆盖了父类,但子类、父类的指针都可以调用该函数,不同的类调用它的结果是不同的
覆盖和多态的条件
覆盖(在virtual修饰下)
父类中的函数被virtual修饰,且函数完全一致
const修饰返回值时会直接出错
参数的加const依旧会被覆盖
参数的类型不同时不会被覆盖
常函数了就不会被覆盖(const加载末尾)
多态
父子类之间有函数覆盖关系
父类的指针或引用指向子类对象
在构造、析构函数中调用虚函数,会因为作用域的不同,导致同一个函数有不同的结果
虚函数的特点
在构造的时候,由于子类还没有运行构造函数,所以父类的构造函数不会被覆盖
在析构时,由于子类已经完成了析构函数,所以父类的析构函数不会再被子类的覆盖
纯虚函数和抽象类
纯虚函数
在虚函数后面添加=0;
可以不实现,但实现必须在类外
只能在父类的构造函数、析构函数中调用
抽象类
成员函数中有纯虚函数,这种类叫抽象类
抽象类不能实例化(不能创建对象)
必须被继承
虚函数被覆盖
子类实例化对象
虚函数没被覆盖
子类变为抽象类,无法实例化
纯抽象类
所有成员函数都是纯虚函数
一般用于设计接口,这种类在子类被替换后不需要修改或少量修改即可继续使用
C++初学6
最新推荐文章于 2024-04-21 22:19:05 发布