下面文章详细介绍C++虚基,所谓C++虚基类:是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的,但前提是要深入理解到底什么是C++虚基类,及他是怎么运行的。
创新互联建站专注为客户提供全方位的互联网综合服务,包含不限于成都网站制作、做网站、普洱网络推广、成都微信小程序、普洱网络营销、普洱企业策划、普洱品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联建站为所有大学生创业者提供普洱建站搭建服务,24小时服务热线:028-86922220,官方网址:www.cdcxhl.com
前面讲过,为了初始化基类的子对象,派生类的构造函数要调用基类的构造函数。对于虚基类来讲,由于派生类的对象中只有一个虚基类子对象。为保证虚基类子对象只被初始化一次,这个虚基类构造函数必须只被调用一次。
由于继承结构的层次可能很深,规定将在建立对象时所指定的类称为最派生类。C++规定,虚基类子对象是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的。如果一个派生类有一个直接或间接的C++虚基类,那么派生类的构造函数的成员初始列表中必须列出对虚基类构造函数的调用。如果未被列出,则表示使用该虚基类的缺省构造函数来初始化派生类对象中的虚基类子对象。
从虚基类直接或间接继承的派生类中的构造函数的成员初始化列表中都要列出这个虚基类构造函数的调用。但是,只有用于建立对象的那个最派生类的构造函数调用虚基类的构造函数。
而该派生类的基类中所列出的对这个虚基类的构造函数调用在执行中被忽略,这样便保证了对虚基类的对象只初始化一次。C++又规定,在一个成员初始化列表中出现对虚基类和非虚基类构造函数的调用,则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;
- }
在派生类B和C中使用了C++虚基类,使得建立的D类对象只有一个虚基类子对象。在派生类B,C,D的构造函数的成员初始化列表中都包含了对虚基类A的构造函数。在建立类D对象时。
只有C++虚基类D的构造函数的成员初始化列表中列出的虚基类构造函数被调用,并且仅调用一次,而类D基类的构造函数的成员初始化列表中列出的虚基类构造函数不被执行。这一点将从该程序的输出结果可以看出。
文章标题:如何对C++虚基类构造函数
转载来于:http://www.shufengxianlan.com/qtweb/news7/545407.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联