- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 二义性:无法确定性、不唯一性 多重继承中可能出现的两种二义性: 同名引起的二义性 公共基类带来的二义性 解决二义性方法:作用域运算符::,虚基类 * 当多重继承的派生类的不同父类中含有同名成员时,这些成员都会被派生类所继承,如果在派生类中简单地通过名字来使用这些成员,就会产生二义性。 为了避免二义性,在派生类中使用不同父类的同名成员时,必须在成员名之前用基类名::来限定,以明确指出所使用的成员是从哪个基类继承来的。 * class A//声明基类A{…};class B :virtual public A//声明类B是类A的公用派生类,A是B的虚基类{…};class C :virtual public A//声明类C是类A的公用派生类,A是C的虚基类{…}; 因为一个基类可以在生成一个派生类时作为虚基类,而在生成另一个派生类时不作为虚基类。经过这样的声明后,当基类通过多条派生路径被一个派生类继承时,该派生类只继承该基类一次。需要注意: 为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。否则仍然会出现对基类的多次继承。虚基类的初始化如果在虚基类中定义了带参数的构造函数,而且没有定义默认构造函数,则在其所有派生类(包括直接派生或间接派生的派生类)中,通过构造函数的初始化表对虚基类进行初始化。例如class A//定义基类A{? ?A(int i){ } //基类构造函数,有一个参数};class B :virtual public A //A作为B的虚基类{? ?B(int n):A(n){ } //B类构造函数,在初始化表中对虚基类初始化};class C :virtual public A //A作为C的虚基类{? ?C(int n):A(n){ } //C类构造函数,在初始化表中对虚基类初始化};class D :public B,public C //类D的构造函数,在初始化表中对所有基类初始化{? ?D(int n):A(n),B(n),C(n){ }};注意: 在定义类D的构造函数时,与以往使用的方法有所不同。规定: 在最后的派生类中不仅要负责对其直接基类进行初始化,还要负责对虚基类初始化。C++编译系统只执行最后的派生类对虚基类的构造函数的调用,而忽略虚基类的其他派生类(如类B和类C) 对虚基类的构造函数的调用,这就保证了虚基类的数据成员不会被多次初始化。 * * 多态:同一个函数名具有不同的实现,同一个运算符具有不同的功能。 ----函数重载和运算符重载 C++支持两种多态性:编译时的多态性和运行时的多态性。 ----静态联编——重载 和动态联编——继承和虚函数 多态的功能强大 * 原指向小空间的指针可以指向大空间,但只能指向它的前一部分”。也即替代之后的派生类仅发挥基类的作用 “原指向大空间的指针(指向派生类的指针)不允许再指向小空间(再指向基类对象)” 虚函数改变了联编方式; 将成员函数声明为虚函数相当于告诉编译程序:由指针实际指向的对象类型决定调用哪个类中定义的函数 使用虚函数时的注意事项: (1)在基类(不一定是最高)中声明虚函数,用虚函数实现多态性时,派生类应从基类公有派生; (2)派生类中同型(与基类虚函数原型完全相同)的成员函数自动成为虚函数; (3)只有非静态成员函数可以声明为虚函数; (4)虚函数声明只出现在类声明中的函数原形中,而不能在成员的函数体实现的时候; (5)虚函数由成员函数调用或通过指针、引用来访问; 使用普通对象调用虚函数时,系统仍然以静态联编方式完成对虚函数的调用。在派生类中声明的成员函数,如果与基类中的虚函数名字相同,但参数不同,是一般的函数重载,屏蔽了基类中的虚函数。 * 赋值兼容性规则: 定义:用公有派生类对象替换基类对象; 理由:公有继承的派生类有基类中除构造函数和析构函数外的所有成员和相应的访问权限; 规则中的替换包括: 派生类的对象可以赋值给基类对象 派生类的对象可以初始化基类的引用 派生类对象的地址可以赋给指向基类的指针 虽然基类出现的地方可以用派生类来代替,但替代之后的派生类仅发挥基类的作用。 注:C++语言不允许使用基类对象给派生类对象赋值。 赋值兼容性是多态性的基础之一。 * 赋值兼容性规则: 定义:用公有派生类对象替换基类对象; 理由:公有继承的派生类有基类中除构造函数和析构函数外的所有成员和相应的访问权限; 规则中的替换包括: 派生类的对象可以赋值给基类对象 派生类的对象可以初始化基类的引用 派生类对象的地址可以赋给指向基类的指针 虽然基类出现的地
文档评论(0)