下载此文档

C 虚基类.doc


文档分类:IT计算机 | 页数:约4页 举报非法文档有奖
1/4
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/4 下载此文档
文档列表 文档介绍
C++ 虚基类 9/3/2001 8:22:51 ·· -- ·· pcvc 12 下一页在《多继承》中讲过的例子中,由类 A ,类 B1 和类 B2 以及类 C 组成了类继承的层次结构。在该结构中,类C 的对象将包含两个类 A 的子对象。由于类 A 是派生类 C 两条继承路径上的一个公共基类, 那么这个公共基类将在派生类的对象中产生多个基类子对象。如果要想使这个公共基类在派生类中只产生一个基类子对象,则必须将这个基类设定为虚基类。虚基类的引入和说明前面简单地介绍了要引进虚基类的原因。实际上, 引进虚基类的真正目的是为了解决二义性问题。虚基类说明格式如下: virtual < 继承方式>< 基类名> 其中, virtual 是虚类的关键字。虚基类的说明是用在定义派生类时, 写在派生类名的后面。例如: class A{ public: void f(); protected: int a; }; class B: virtual public A { protected: int b; }; class C: virtual public A { protected: int c: }; class D: public B, public C { public: int g(); private: int d; }; 由于使用了虚基类,使得类 A ,类 B ,类 C 和类 D 之间关系用 DAG 图示法表示如下: A{ f(), a}/\ B{b} C{c} \/ D{g(),d} 从该图中可见不同继承路径的虚基类子对象被合并成为一个对象。这便是虚基类的作用,这样将消除了合并之前可能出现的二义性。这时,在类 D 的对象中只存在一个类 A 的对象。因此,下面的引用都是正确的: D n; (); file:// 对 f() 引用是正确的。 void D::g() { f(); file:// 对 f() 引用是正确的。} 下面程序段是正确的。 D n;A *pa; pa= &n; 其中, pa 是指向类 A 对象的指针,n 是类 D 的一个对象, &n 是n 对象的地址。 pa=& n 是让 pa 指针指向类 D 的对象,这是正确的,并且也无二义性。虚基类的构造函数前面讲过, 为了初始化基类的子对象, 派生类的构造函数要调用基类的构造函数。对于虚基类来讲, 由于派生类的对象中只有一个虚基类子对象。为保证虚基类子对象只被初始化一次, 这个虚基类构造函数必须只被调用一次。由于继承结构的层次可能很深, 规定将在建立对象时所指定的类称为最派生类。 C++ 规定, 虚基类子对象是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。如果一个派生类有一个直接或间接的虚基类, 那么派生类的构造函数的成员初始列表中必须列出对虚基类构造函数的调用。如果未被列出, 则表示使用该虚基类的缺省构造函数来初始化派生类对象中的虚基类子对象。从虚基类直接或间接继承的派生类中的构造函数的成员初始化列表中都要列出这个虚基类构造函数的调用。但是,只有用于建立对象的那个最派生类的构造函数调用虚基类的构造函数,而该派生类的基类中所列出的对这个虚基类的构造函数调用在执行中被忽略,这样便保证了对虚基类的对象只初始化一次。 C++ 又规定, 在一个成员初始化列表中出现对虚基类和非虚基类构造函

C 虚基类 来自淘豆网m.daumloan.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数4
  • 收藏数0 收藏
  • 顶次数0
  • 上传人luyinyzhi
  • 文件大小0 KB
  • 时间2016-07-14