科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件C++ 虚基类

C++ 虚基类

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在《多继承》中讲过的例子中,由类A,类B1和类B2以及类C组成了类继承的层次结构......

作者:佚名 来源:PCVC 2007年10月30日

关键字: Linux

  • 评论
  • 分享微博
  • 分享邮件
虚基类的构造函数

  前面讲过,为了初始化基类的子对象,派生类的构造函数要调用基类的构造函数。对于虚基类来讲,由于派生类的对象中只有一个虚基类子对象。为保证虚基类子对象只被初始化一次,这个虚基类构造函数必须只被调用一次。由于继承结构的层次可能很深,规定将在建立对象时所指定的类称为最派生类。C++规定,虚基类子对象是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。如果一个派生类有一个直接或间接的虚基类,那么派生类的构造函数的成员初始列表中必须列出对虚基类构造函数的调用。如果未被列出,则表示使用该虚基类的缺省构造函数来初始化派生类对象中的虚基类子对象。

  从虚基类直接或间接继承的派生类中的构造函数的成员初始化列表中都要列出这个虚基类构造函数 的调用。但是,只有用于建立对象的那个最派生类的构造函数调用虚基类的构造函数,而该派生类的基类中所列出的对这个虚基类的构造函数调用在执行中被忽略,这样便保证了对虚基类的对象只初始化一次。

  C++又规定,在一个成员初始化列表中出现对虚基类和非虚基类构造函数的调用,则虚基类的构造函数先于非虚基类的构造函数的执行。

  下面举一例子说明具有虚基类的派生类的构造函数的用法。

#include
class A
{
public:
A(const char *s) { cout< ~A() {}
};

class B : virtual public A
{
public:
B(const char *s1, const char *s2):A(s1)
{
cout< }
};

class C : virtual public A
{
public:
C(const char *s1, const char *s2):A(s1)
{
cout< }
};

class D : public B, public C
{
public:
D(const char *s1, const char *s2, const char *s3, const char *s4)
:B(s1, s2), C(s1, s3), A(s1)
{
cout< }
};

void main()
{
D *ptr = new D("class A", "class B", "class C", "class D");
delete ptr;
}

  该程序的输出结果为:

  class A
  class B
  class C
  class D

  在派生类B和C中使用了虚基类,使得建立的D类对象只有一个虚基类子对象。

  在派生类B,C,D的构造函数的成员初始化列表中都包含了对虚基类A的构造函数。

  在建立类D对象时,只有类D的构造函数的成员初始化列表中列出的虚基类构造函数被调用,并且仅调用一次,而类D基类的构造函数的成员初始化列表中列出的虚基类构造函数不被执行。这一点将从该程序的输出结果可以看出。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章