C++拾遗(十一)类继承

时间:2023-03-10 01:08:17
C++拾遗(十一)类继承

首先,这里提到的继承都是公用继承。

派生类

1、派生类需要添加自己的构造函数。

2、派生类创建之前会首先创建基类对象,即调用基类构造函数。在派生类构造函数后通过初始化列表将参数传递给基类构造函数。

3、派生类的构造函数主要用于初始化新增的数据成员。

4、释放对象时与创建相反,先调用派生类的析构函数再调用基类的析构函数。

关于派生类的使用:

1、派生类可以使用基类的非私有方法。

2、派生类不能访问基类的私有成员。

另外:

1、基类指针可以指向派生类。

2、基类引用可以引用派生类对象。

但是这种基类指针、引用只能使用基类的方法,不能使用派生类独有的方法。

隐藏

基类和派生类同名的成员函数,无论参数是否相同,只要同名都构成隐藏。

此时派生类实例化的对象默认使用派生类的成员函数,若要使用基类下的同名函数要如此使用:children.Father::function();

同名的成员变量同理。

多态公有继承

实现有两种方法:

1、使用virtual 虚方法。

2、在派生类中重新定义基类的方法。

virtual的意义

没有virtual,根据引用类型或者指针类型选择调用的方法。

有virtual,根据引用或者指针指向的对象的类型选择调用的方法。

析构函数通常是virtual的,这可以保证析构函数被正确地调用。

静态联编与动态联编

联编:编译器将源代码中的函数调用解释为执行特定的函数代码。

静态联编:编译过程中进行联编。

动态联编:运行时决定使用哪个方法。编译器对虚方法使用动态联编。

虚函数表

只有类中有虚函数的类才会有虚函数表。以下摘自http://www.cnblogs.com/Ripper-Y/archive/2012/05/15/2501930.html

C++拾遗(十一)类继承

C++拾遗(十一)类继承

图中vtable就是该类的虚函数表。

可以看到,如果派生类中没有重新定义基类中的虚函数,则虚函数表中仍然保存的是原始版本的虚函数。

以下图片及资料来自:http://blog.****.net/haoel/article/details/1948051/

在多重继承时:

左为继承关系,右为一个子类实例中的虚表。

 C++拾遗(十一)类继承 C++拾遗(十一)类继承

1、子类实例中的虚函数表中每个父类都有一个自己的虚表,而且子类独有的虚函数放在第一个父类的虚表中。

2、子类在重新定义父类中有的虚函数时,会同时覆盖所有虚表的该虚函数。

抽象基类

有纯虚函数的类是一个抽象基类,只能作为基类,不能创建实例,其它的类成员函数可以定义。纯虚函数声明类似 virtual fun() = 0;