虚拟继承中构造函数调用的顺序是什么? < C++中虚拟继承中构造函数调用的顺序是什么?
对于以下两种情况的多重继承虚拟继承中构造函数调用的顺序是什么? < C++中虚拟继承中构造函数调用的顺序是什么?,c++,inheritance,virtual,C++,Inheritance,Virtual,对于以下两种情况的多重继承 class a { public: a() { cout<<"\t a"; } }; class b: public a { public: b() { cout<<"\t b"; } }; class c: public b { public: c
class a
{
public:
a()
{
cout<<"\t a";
}
};
class b: public a
{
public:
b()
{
cout<<"\t b";
}
};
class c: public b
{
public:
c()
{
cout<<"\t c";
}
};
class d: public c
{
public:
d()
{
cout<<"\t d";
}
};
class e: public c, public d
{
public:
e()
{
cout<<"\t e";
}
};
class f: public b, public e
{
public:
f()
{
cout<<"\t f";
}
};
int main()
{
f aaa;
return 0;
}
(一) 对于以下代码,没有虚拟继承
class a
{
public:
a()
{
cout<<"\t a";
}
};
class b: public a
{
public:
b()
{
cout<<"\t b";
}
};
class c: public b
{
public:
c()
{
cout<<"\t c";
}
};
class d: public c
{
public:
d()
{
cout<<"\t d";
}
};
class e: public c, public d
{
public:
e()
{
cout<<"\t e";
}
};
class f: public b, public e
{
public:
f()
{
cout<<"\t f";
}
};
int main()
{
f aaa;
return 0;
}
(二) 使用类e的虚拟继承:
class a
{
public:
a()
{
cout<<"\t a";
}
};
class b: public a
{
public:
b()
{
cout<<"\t b";
}
};
class c: public b
{
public:
c()
{
cout<<"\t c";
}
};
class d: public c
{
public:
d()
{
cout<<"\t d";
}
};
class e: public c, public d
{
public:
e()
{
cout<<"\t e";
}
};
class f: public b, public virtual e
{
public:
f()
{
cout<<"\t f";
}
};
int main()
{
f aaa;
return 0;
}
有人能解释一下在这两种情况下是如何获得输出的吗?
虚拟继承如何影响对象的构造?将首先初始化虚拟基类,否则,将按照基类声明的从左到右顺序初始化直接基类 对于类
f
,类f:public b,public e
,没有虚拟基类,直接基类b
将首先初始化,然后e
。(从左到右顺序)
对于class f:public b,public virtual e
,将首先初始化虚拟基类e
,然后初始化b
见:
1) 如果构造函数用于派生最多的类,则为virtual base
类按照它们在中出现的顺序进行初始化
基类声明的深度优先从左到右遍历
(从左到右表示基本说明符列表中的外观)
2) 然后,按从左到右的顺序初始化直接基类,如下所示
它们出现在此类的基本说明符列表中
3) 然后,按照以下顺序初始化非静态数据成员:
类定义中的声明
4) 最后,执行构造函数的主体
a b c a b c d e a b f