WEB开发网
开发学院软件开发VC VC++深入详解:多重继承 阅读

VC++深入详解:多重继承

 2008-11-24 19:39:04 来源:WEB开发网   
核心提示:如同该名字中所描述的,一个类可以从多个基类中派生,VC++深入详解:多重继承,在派生类由多个基类派生的多重继承模式中,基类是用基类表语法成分来说明的,编译器无法确定用户需要的到底是哪一个基类的output()函数,而产生'A::output' is ambiguous的错误信息,多重继承的语法与单一继承

如同该名字中所描述的,一个类可以从多个基类中派生。在派生类由多个基类派生的多重继承模式中,基类是用基类表语法成分来说明的,多重继承的语法与单一继承很类似,只需要在声明继承的多个类之间加上逗号来分隔,定义形式为:

class派生类名:访问权限 基类名称,访问权限 基类名称,访问权限 基类名称

 {
      ……
  };

例如B类是由类C和类D派生的,可按如下方式进行说明:

  class B:public C, public D
  {
      ……
  }

基类的说明顺序一般没有重要的意义,除非在某些情况下要调用构造函数和析构函数时,在这样的情况下,会有一些影响。

n 由构造函数引起的初始化发生的顺序。如果你的代码依赖于B的D部分要在C部分之前初始化,则此说明顺序将很重要,你可以在继承表中把D类放到C类的前面。初始化是按基类表中的说明顺序进行初始化的。

n 激活析构函数以做清除工作的顺序。同样,当类的其他部分正在被清除时,如果某些特别部分要保留,则该顺序也很重要。析构函数的调用是按基类表说明顺序的反向进行调用的。

虽然,多重继承使程序编写更具有灵活性,并且更能真实地反映现实生活,但由此带来的麻烦也不小。我们看例2-15所示的程序(EX07.CPP):

例2-15

  1. #include <iostream.h>
  2. class B1
  3. {
  4. public:
  5.   void output();
  6. };
  7. class B2
  8. {
  9. public:
  10.   void output();
  11.};
  12.void B1::output()
  13.{
  14.   cout<<"call the class B1"<<endl;
  15.}
  16.void B2::output()
  17.{
  18.   cout<<"call the class B2"<<endl;
  19.}
  20.
21.class A:public B1,public B2
  22.{
  23.public:
  24.   void show();
  25.};
  26.void A::show()
  27.{
  28.   cout<<"call the class A"<<endl;
  29.}
  30.void main()
  31.{
  32.   A a;
      a.output();     //该语句编译时会报错
  33.   a.show();
  34.}

例2-15的程序乍一看,好像没有错误,但是,编译时就会出错。原因何在?由第21行代码我们知道派生类A是从基类B1和B2多重继承而来的,而基类B1和B2各有一个output()函数,在第33行,当类A的对象a要使用a.output()时,编译器无法确定用户需要的到底是哪一个基类的output()函数,而产生'A::output' is ambiguous的错误信息,请读者注意。

Tags:VC 深入 详解

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接