C++问题记录之继承篇:
类的public和private数据成员可以通过public下的成员函数进行访问。
实例化的对象无法直接访问到类内public和private数据成员。
1.继承方式和数据类型:
public
protected
Private
三种字符下数据表示的含义及其继承方式。
经过public继承后,父类中各数据成员属性保持不变,private不可访问。
经过protected继承后,父类中的:public变为protected,protected变为private(即各降一级),private依然不可访问(消失)。
经过private继承后,所有数据成员变为private类型。
所有继承方式中,private成员只能被父类访问,不允许被继承。
对应的实例化后的对象的调用方式与先前一样。
public继承:
protected继承:
private继承:
构造顺序:先执行父类构造函数,再执行子类构造函数(无论在堆中还是在栈中,都具有相同的特性)
父类的public下的成员函数和数据成员被继承到子类的public访问限定符下,并且子类的实例化对象可以访问父类的public下的成员函数和数据成员
子类的实例化对象可以通过子类本身的成员函数来访问到从父类继承来的public和private数据成员。
父类的private数据成员继承到子类后直接消失。子类的实例化对象不能访问父类的public中的成员函数和数据成员(继承后变为protected),只能访问自身的public下的成员函数和数据成员。
2.隐藏和覆盖
用在当数据成员名字一样的时候(子类和父类)
总结为:父子关系,成员同名,隐藏。
同名时,如果需要调用父类的函数,格式:实例化对象.父类::成员函数(加::作用域)
Is A:子类是父类,派生类的对象可以赋值给基类,也可以用基类的指针指向派生类的对象。
子类给父类赋值的时候,父类中没有的数据直接被截断。
如果用一个父类的指针指向子类的对象的时候,只能获取到父类原有的数据部分。
虚析构函数:(virtual)
当用父类的指针去指向堆中子类的对象,并且我们还想用父类的指针来释放这段内存,那么我们就需要虚析构函数。
多继承:
是指一个子类继承多个父类。倒三角的不是多继承。正三角是。
多重继承:A:继承类型 B,继承类型 C—A同时继承了B和C,中间要加逗号,不写继承类型的话默认为private继承。
B继承A,C继承B。
重点!!!多继承中的拷贝构造函数执行顺序问题:
当子类继承多个父类的时候,父类构造函数的执行顺序跟继承时候的声明顺序有关,而跟子类构造函数的初始化列表无关,参考初始化列表的执行顺序与变量的声明有关,而跟顺序无关。而析构的时候顺序恰好相反,参考栈(先入后出)。
虚继承:(虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。)
虚继承:在继承定义中包含了virtual关键字的继承关系;
虚基类:在虚继承体系中的通过virtual继承而来的基类;
如图,假设类a是父类,b类和c类都继承了a类,而d类又继承了b和c,那么由于d类进行了两次多重继承a类,就会出现两份相同的a的数据成员或成员函数,就会出现代码冗余。
3.解决重定义:
还有一种解决重定义的方法是在开头加上#pragma once