C++ Primer第五版笔记——继承与动态绑定

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rest_in_peace/article/details/81741245

派生类对象及派生类向基类的类型转换:
一个派生类对象包含多个组成部分:一个含有派生类自己定义的成员的子对象,以及一个与该派生类继承的基类对应的子对象,如果有多个基类,那么这样的子对象也有多个。因此,我们能把派生类对象当成基类对象来使用,也可以将基类的指针或是引用绑定到派生类对象中的基类部分上。

派生类构造函数:
尽管在派生类中有从基类继承过来的成员,但是派生类并不能直接初始化这些成员,而是要使用基类的构造函数来初始化。

//假设B继承于A,B有自己的成员b1和b2,A有a1和a2
B(string l1,int l2,double l3,size_t l4):
    A(l1,l2),b1(l3),b2(l4){}

会首先执行基类的构造函数,在按照声明的顺序初始化派生类成员。

派生类使用基类成员:
派生类可以访问基类的公有成员和保护成员,使用方式与使用派生类自己成员的方式相同。
必须明确地一点:每个类负责定义各自的接口。要想与类的对象交互必须是用该类的接口,即使这个对象时派生类的基类部分。举个例子:从语法上来讲,是可以在派生类的构造函数中对基类的公有成员和保护成员进行赋值的,但是最后不要这么做,应该遵循基类的接口,通过调用基类的构造函数来初始化那些从基类继承来的成员。

继承与静态成员:
如果基类定义了一个静态成员,则在整个继承体系中只存在该成员的唯一定义,不论派生出多少个类,对每个静态成员来说都只存在一个实例。静态成员遵守通用的访问规则,如果是私有的,则派生类无权访问它。

被用作基类的类:
如果想将某个类用作基类,那么这个类必须已经被定义而不仅仅是声明。这规定还有一层隐含的意思,即一个类不能派生它本身。

防止继承的发生:
有时我们会想定义一种类,不希望有其他类继承于它,在C++11新标准中的方法是在类名后跟关键字“final”

class NoDerived final {/*...*/};

类型转换与继承:
通常将引用或指针绑定到一个对象上时,引用与指针的类型应该与对象的类型一致,或者对象的类型含有一个可接受的const类型转换规则。但存在继承关系的类是一个重要的例外:我们可将基类的指针或引用绑定到派生类对象上。这种行为有一层几位重要的含义:当使用基类的引用或指针时,实际上并不清楚所绑定对象的真实类型,可能是基类对象也可能是派生类对象。

静态类型与动态类型:
表达式的静态类型在编译时总是已知的,它是变量声明时的类型或者表达式生成的类型;动态类型则是变量或表达式表示的内存中的对象的类型,要到运行时才会知道。
如果一个表达式既不是指针也不是引用,则它的动态类型与静态类型永远一致。而基类的指针或引用的静态类型和动态类型可能不一致。

不存在从基类到派生类的隐式类型转换:
之所以存在派生类向基类的类型转换是因为每个派生类对象都包含基类的部分,而基类的指针和引用可以绑定到该部分上。而基类对象可能是派生类对象的一部分也可能不是,所以不存在从基类到派生类的隐式转换,举个例子:派生类新添加的成员在基类中不存在,派生类的指针绑定基类时去访问这个成员就会造成错误。

在对象之间不存在类型转换:
派生类和基类的自动转换只存在于指针和引用中,在派生类类型和基类类型之间不存在这样的转换。当我们用一个派生类对象为一个基类对象初始化或赋值时,只有该派生类对象中的基类部分被拷贝、移动或赋值,它的派生部分将会被忽略。

关键概念总结:
1.从派生类向基类的类型转换只对指针或引用类型有效;
2.基类向派生类不存在隐式类型转换;
3.和任何其它成员一样,派生类向基类的类型转换也可能因为访问受限变得不可行;
4.通常能将一个派生类对象移动、拷贝或赋值给一个基类对象,但是只处理派生类对象中的基类部分。

猜你喜欢

转载自blog.csdn.net/rest_in_peace/article/details/81741245