c++ primer plus 第六版第十四章学习笔记

1、is-a关系:公有继承,获得实现与接口;has-a关系:包含、私有、保护继承,获得实现不获得接口。

2、公有、私有、保护继承:基类的私有成员都不能直接访问,只能通过基类方法调用;公有继承可以通过派生类直接调用基类方法,私有和保护继承只能通过基类名调用基类方法;对于隐式向上转换(将基类指针或引用指向派生类):公有继承可以在所有对象中进行,保护继承只能在派生类中使用,私有继承不允许这种转换。

3、包含、私有:均不能通过子对象直接调用祖先的方法,包含使用包含的对象名调用祖先方法,私有继承使用类名调用祖先的方法;一般而言应使用包含,除非需要访问原有类的保护成员,或者需要重新定义虚函数。

4、保护、私有继承:基类的方法调用相同,只能在派生类中通过基类名调用;公有和保护成员在保护继承中成为第二代派生类的保护成员,因此可以在第三代派生类中使用基类的公有方法,因为它们在第二代中是受保护的;而在私有继承中公有和保护成员则成为第二代派生类的私有成员,因此第三代派生类将不能使用基类的公有方法,因为他们在第二代派生类中是私有的。

5、多重继承(MI):由多个派生类派生的类;多于多重继承,需要考虑:①构成最终类的派生类的基类是否相同,若相同可能存在基类相同但地址不同而造成的二义性,此时需要将公有基类声明为虚基类(在基类的派生类声明前加vitual),此时MI的构造函数语法与普通派生类有差;②可能继承同名方法导致函数调用二义性:使用同名方法前加作用域解析运算符;

6、有相同基类的多种继承注意:①使用虚基类,对于要作为多种继承类的子对象若有多个子对象由相同的基类派生而来,则需要在子对象的public/private/protect声明前加vitual,使在多重继承类中他们共用一个基类;②构造函数都需调用基类,只调用子对象的构造函数不能构造共用的基类,只能对该子对象中所特有的成员赋值,在多重继承类的构造函数中,都需要使用基类构造函数;③输出类对象时可能出现两次输出基类的情况,若在子对象中采用递增的方式定义输出(即在基类的输出函数基础上加上特有的成员输出语句),在多重继承类中直接采用调用所包含的子对象输出函数会出现多次调用基类输出而造成的基类成员输出重复,可以采用在子对象中定义保护方法输出特有的成员,在多重继承类中采用一个子对象输出加调用其他子对象方法的方式避免这种情况。④对于公有继承的多重继承类不能直接访问子对象的私有对象,若直接调用多个子对象的设置函数同样会造成多次设置基类成员的情况,此时也可以采用③中的方法,在子对象中定义保护方法用于设置特有的子对象成员。(③④具体方法参见14.5的两个子类的保护方法)

1、is-a关系:公有继承,获得实现与接口;has-a关系:包含、私有、保护继承,获得实现不获得接口。

2、公有、私有、保护继承:基类的私有成员都不能直接访问,只能通过基类方法调用;公有继承可以通过派生类直接调用基类方法,私有和保护继承只能通过基类名调用基类方法;对于隐式向上转换(将基类指针或引用指向派生类):公有继承可以在所有对象中进行,保护继承只能在派生类中使用,私有继承不允许这种转换。

3、包含、私有:均不能通过子对象直接调用祖先的方法,包含使用包含的对象名调用祖先方法,私有继承使用类名调用祖先的方法;一般而言应使用包含,除非需要访问原有类的保护成员,或者需要重新定义虚函数。

4、保护、私有继承:基类的方法调用相同,只能在派生类中通过基类名调用;公有和保护成员在保护继承中成为第二代派生类的保护成员,因此可以在第三代派生类中使用基类的公有方法,因为它们在第二代中是受保护的;而在私有继承中公有和保护成员则成为第二代派生类的私有成员,因此第三代派生类将不能使用基类的公有方法,因为他们在第二代派生类中是私有的。

5、多重继承(MI):由多个派生类派生的类;多于多重继承,需要考虑:①构成最终类的派生类的基类是否相同,若相同可能存在基类相同但地址不同而造成的二义性,此时需要将公有基类声明为虚基类(在基类的派生类声明前加vitual),此时MI的构造函数语法与普通派生类有差;②可能继承同名方法导致函数调用二义性:使用同名方法前加作用域解析运算符;

6、有相同基类的多种继承注意:①使用虚基类,对于要作为多种继承类的子对象若有多个子对象由相同的基类派生而来,则需要在子对象的public/private/protect声明前加vitual,使在多重继承类中他们共用一个基类;②构造函数都需调用基类,只调用子对象的构造函数不能构造共用的基类,只能对该子对象中所特有的成员赋值,在多重继承类的构造函数中,都需要使用基类构造函数;③输出类对象时可能出现两次输出基类的情况,若在子对象中采用递增的方式定义输出(即在基类的输出函数基础上加上特有的成员输出语句),在多重继承类中直接采用调用所包含的子对象输出函数会出现多次调用基类输出而造成的基类成员输出重复,可以采用在子对象中定义保护方法输出特有的成员,在多重继承类中采用一个子对象输出加调用其他子对象方法的方式避免这种情况。④对于公有继承的多重继承类不能直接访问子对象的私有对象,若直接调用多个子对象的设置函数同样会造成多次设置基类成员的情况,此时也可以采用③中的方法,在子对象中定义保护方法用于设置特有的子对象成员。(③④具体方法参见14.5的两个子类的保护方法)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值