1.作为新手学习C++的继承与派生,首先应该了解C++的继承与派生有何现实意义?
其现实意义在于可以使程序员无需修改已有类,只需在已有类的基础上,通过增加少量代码或修改少量代码的方法得到新的 类,较好地解决了代码重用问题,减少代码的冗余度。
2.继承与派生的定义是什么?
继承与派生针对的是类,从已有类产生新类的过程叫派生,新类保留了基类中的某些成员属性叫继承。
3.如何定义一个继承基类某些成员的派生类?
以下展示一下公有继承的代码
私有继承:class Student:private Person、保护继承:class Student:protected Person (定义时的打法除了这里不一样,其余是相同的)
4.私有继承、公有继承、保护继承有什么相同点与不同点?
这三种继承方式主要的不同在于派生类对基类成员访问规则的不同
私有继承的访问规则:
公有继承的访问规则:
保护继承的访问规则:
虽然这三章表格已经涵盖了这三种继承方式的相同点与不同点,但是对于新手的理解来说是会很混乱的!
首先,我们来理解清楚什么是内部访问,什么是对象访问:
(1)内部访问指的是在定义派生类时在类的内部对基类的成员进行访问
(2)对象访问指的是在已经定义好派生类后,在派生类的外部定义派生类的对象时对基类进行访问
其次,我们把三张表格里的内容转化成文字内容提取出来,加深理解:
(1)私有继承:只可内部访问基类的公有成员和保护成员
(2)公有继承:不只可以内部访问基类的公有成员和保护成员,还可以对象访问基类的公有成员
(3)私有继承:只可内部访问基类的公有成员和保护成员
(4)私有继承和公有继承的区别:(1)公有继承可以对象访问基类的公有成员,而私有继承不可以
(2)私有继承得到的派生类的派生类,没有任何方法访问基类的任何成员
(3)公有继承得到的派生类的派生类,有机会访问基类的公有成员或保护成员
(5)私有继承和保护继承的区别:(1)私有继承得到的派生类的派生类,没有任何方法访问基类的任何成员
(2)保护继承得到的派生类的派生类,有机会访问基类的公有成员或保护成员
(6)公有继承和保护继承的区别:公有继承得到的派生类可以对象访问基类的公有成员,而保护继承不可以
(7)私有继承、公有继承、保护继承三者的共同点:
无论是内部访问还是对象访问,不管哪种访问方式都无法访问基类的私有成员
(8)公有继承的独特点:可以对象访问基类的公有成员
5.派生类的构造函数和析构函数的调用顺序是谁先谁后?
(1)调用构造函数时:先调用基类的构造函数,后调用派生类的构造函数
(2)调用析构函数时:先调用派生类的析构函数,后调用基类的析构函数
6.多重继承的构造函数与析构函数的调用顺序
(1)构造函数的调用顺序:定义派生类时“:”后从左往右的继承顺序依次调用基类的构造函数
(2)析构函数的调用顺序:跟构造函数的调用顺序相反
7.什么是虚基类?
基类很容易理解就是最原始的类,没有任何基础,自己独立创造的类
而虚基类在字面上就比较难理解了,也没有明确的文字定义,只能从虚基类的使用场合和作用进行说明:
如果一个类有多个直接基类,而这些直接基类又有一个共同的基类,则在最低层的派生类中会保留这个简介的共同积累数据成 员的多份同名成员。在派生类中访问这些同名成员时,必须加上“基类名 ::”,使其唯一地标识是哪一个基类的成员,以免产生 二义性。上述其实是虚基类的使用场合,也就是多重继承下,如果想不加"::"就访问这些同名成员,则必须定义虚基类,虚基类 的作用是使派生类中可以访问的同名成员统一,即所有基类同名成员都是同一个成员,不再细分该同名成员属于哪一个类,
同名成员的值等于最后一次直接基类所定的同名成员的值。
8.多重继承的派生类的构造函数如何定义
9.如果多重继承时,多个直接基类中含有同名成员,可不可以不定义虚基类直接进行多重继承?
答案是肯定不可以的,首先这么做,VS2017肯定会报错,显示无法访问基类的同名成员。其次,当自己写多重继承下的构造 函数时就会发现很奇怪,不知道如何写构造函数的参数。这时候就会很疑惑,直接写多重继承时所继承的同名成员不可以是直 接继承继承顺序排最后的类的同名成员吗?这时候需要反过来思考,如果这样可以的话,那么这和直接定义一个虚基类有何区 别呢,大家最终都是起到了同名成员归一化的作用--------不再细分同名成员属于哪一个类,以免产生二义性。
10.派生类可否只继承基类的部分成员?
不可以,必须继承全部成员(基类的构造函数和析构函数除外),当然,继承归继承,继承仅仅代表这个派生类有这个成员,至 于使不使用它就是用户自行定义。