虚基类的子类的构造函数

class A

{
 public:
  A(const char *s)
  {cout<<s<<endl;}
   ~A() {};
};
class B:virtual public A
{
 public:
  B(const char *s1,const char *s2):A(s1)
  {
   cout<<s2<<endl;
  }
};
class C:virtual public A
{
 public:
 C(const char *s1,const char *s2):A(s1)
 {
  cout<<s2<<endl;
 }
};
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<<s4<<endl;
  }
};
void main()
{
 D *ptr=new D("class A","class B","class C","class D");
 delete ptr;
}
执行输出的结果为

class A

class B

class C

class D

上述结果表明只有类D的构造函数的成员初始化列表中列出的虚基类构造函数被调用,并且仅调用一次,而类D的基类的构造函数的成员初始化列表中列出的虚基类构造函数不执行。

 如果B构造函数后面没有:A(s1),则自动调用A父类的缺省构造函数。


posted @ 2017-09-01 13:59  小时候挺菜  阅读(352)  评论(0编辑  收藏  举报