派生类构造函数和虚基类

派生类的构造函数

派生类的构造函数:

                                    1. 派生类新增成员:派生类定义构造函数初始化
                                     2. 继承类的成员:自动调用基类构造函数初始化
                                    3. 派生类的构造函数需要给基类构造函数初始化
                    语法: 派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名(参数表),本类成员初始化列表{ };

当有继承又有组合时的继承函数,先用继承构造,再构造组合(组合—成员是其它类的类型,构造时调用其所在类的构造函数)

复制构造函数

                     1. 一般都需要为基类的复制构造函数传递参数
                      2.复制构造函数只能接受一个参数,既用来初始化**派生类定义的成员**,也将被传递给**基类**的复制构造函数
      **  基类的复制构造函数形参类型是基类对象的引用,实参可以是派生类对象的引用**
      ·c::c(const c &c1):B(c1){ }

#派生类的析构函数:析构那个函数不会被继承

访问从基类继承的成员

作用域限定:当派生类与基类中有相同成员时: 1. 若未特别限定,则通过派生类对象,使用的是派生类中的同名成员,如果通过派生类对象访问基类中被隐藏的同名成员,应使用基类名和作用域操作符(::)来限定

二义性问题:从不同基类继承了同名成员,访问时,“派生类成员名或引用名.成员名”,“派生类指针->成员名”,访问成员存在二义性
解决方式:用类名去限定
继承自相同类基类,最终派生类又汇聚成一个类,这些基类会有同名成员,不仅名字相同,本质上是相同的东西,此时不仅仅是区分一下名字,避免二义性问题,访问从最远基类继承过来的成员时,将产生冗余,不仅仅浪费空间,很有可能带来不一致性,同一个值,设定这一个类中的这个值为3,另一个类中的这个值为2,使用者想要控制的是一个值,此时却出现两个类中都包含这个值,所以不光冗余,而且不一致。
解决方法:用虚基类,继承时,用vitual,说明是虚继承
虚基类的派生构造函数:虚基类的成员由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的
在整个继承结构中,直接或间接继承虚基类的所有派生类,都必须在构造函数的成员列表中为虚基类的构造函数列出参数,在构造对象时,这么多级派生类,都会给它传参数,用哪个?只有最远派生类的构造函数调用虚基类的构造函数,中间各级传的参数都被它忽略了,只收最远派生类传给虚基类的参数。

猜你喜欢

转载自www.cnblogs.com/ymd12103410/p/9573830.html