`
codepeak
  • 浏览: 31961 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

虚继承的构造函数调用问题

阅读更多
在某一个虚基类的任何一个派生类的构造函数中,都要将该虚基类的构造函数显示列出来。
包含虚基类的派生类对象的构造函数的调用顺序如下:
  1. 虚基类的构造函数在非虚基类之前调用。
  2. 若同一层次中包含多个虚基类,这些虚基类的构造函数按它们说明的顺序调用。
  3. 若虚基类由非虚基类派生而来,则仍然按照先调用基类的构造函数,再调用派生类的构造函数的执行顺序。
#include <iostream>

using namespace std;

class base{
	int x;
public:
	base(int i){
		cout<<(x = i)<<endl;
	}
};

class A1 : virtual base{
public:
	A1(int i):base(i){}
};

class A2 : virtual base{
public:
	A2(int i):base(i){}
};

class C: public A1,public A2{
public:
	C(int i):A1(i+1),A2(i+2){}
};

int main(){
	C c(1);
}

程序报错:找不到base类的默认构造函数
说明:
        在类C实例化要调用base的构造函数,因为没有显示给出,所以编译器试图调用base的默认构造函数,但是程序没有提供,所以报错。
        当采用虚继承时,最终派生类对象中只有一个虚基类的对象,因此该虚基类的对象只要构造一次即可(由此支持多继承)。而且该构造函数是在最终的派生类构造函数中调用的,中间派生类不调用虚基类的构造函数。
        在本例中,要定义C类的对象c,C类的构造函数直接调用base类的构造函数,来构造唯一的对象,虽然该对象也属于c中A1,A2的无名对象,但是A1,A2的构造函数列表中对base构造函数的调用被忽略。
        改正方法:
        将类C的构造函数改成C(int i):base(i),A1(i+1),A2(i+2){}或者给base类添加默认构造函数都可。
        可以看出在A1,A2中对类base的构造函数都没有调用,当然如果直接定义A1或A2的对象,则类base的构造函数要被调用。
分享到:
评论

相关推荐

    C++ 虚继承对基类构造函数调用顺序的影响

    继承作为面向对象编程的一种基本特征,其使用频率...  假设derived 虚继承自base类,那么derivd与base是一种“has a”的关系,即derived类有一个指向base类的vptr。(貌似有些牵强!某些编译器确实如此)  因此虚

    C++ 课程作业 继承与派生 (motorcycle类设计(虚基类))

    声名一个基类vehicle,有私有成员maxspeed和weight,公有成员run...注意:构造函数和析构函数中均为cout语句,说明哪个构造/析构函数被调用。 该题重点和难点在于构造函数的设计,需考虑怎么给基类及最远基类传递参数。

    完全掌握C++编程中构造函数使用的超级学习教程

    按声明顺序调用基类和成员构造函数。 如果类派生自虚拟基类,则会将对象的虚拟基指针初始化。 如果类具有或继承了虚函数,则会将对象的虚函数指针初始化。虚函数指针指向类中的虚函数表,确保虚函数正确地调用绑定...

    验证有继承时的调用顺序

    设计程序 验证单继承 多继承 重复继承以及有虚基类时 构造函数与析构函数的调用顺序

    c++模拟测试题

    调用了 A 的构造函数 6 次。N 12、派生类后于基类构造,先于基类释放。Y 13、类是对象的抽象,对象是类的具体化。Y 14、二进制文件中数据的存放格式和计算机内存中存储的格式是一致的。Y 15、流提取运算符和流插入...

    类的继承与派生实验

    1:掌握单继承和多继承下派生类的定义方法,理解基类成员在...3:理解同名冲突的产生原因,会使用虚基类来解决第三类同名冲突问题,并理解引入虚基类后构造函数、析构函数的调用顺序。 4:理解赋值兼容的相关使用方法。

    多重继承--虚基类工程代码

    且构造函数和析构函数的调用顺序和单继承是一样的,先调用基类构造函数,再调用对象成员的构造函数,最后调用派生类的构造函数。那么处于同一层次的各个基类构造函数的调用顺序是取决于声明派生类时所指定的各个基类...

    c++基础语法:构造函数与析构函数

    说实话c++还是以前在学校的时候用过的,从毕业到现在一直用...现在主要看看继承中的构造函数和析构函数的调用: 代码如下:class A {} ;class B : public A{};class C : public B{}; c * ptr = new C() ;delete

    c++多态性与虚函数练习题

    1、定义一个类A,在A中有两个私有的整型变量a和b,定义构造函数对a和b进行初始化,并实现成员函数getA()和getB()分别取得a和b的值。定义类B为A的公有继承类,并定义同名成员函数getA(),使其返回a的2倍。主函数中...

    VC学习文档 当对两个值做比较的时候,将常量放在前面,如果逻辑错误的话,编译时就会出错,例如:

    子类继承父类以后,当子类创建对象时先调用父类的构造函数再调用子类的构造函数,删除对象时先调用子类的析构函数再调用父类的析构函数。 关于函数的覆盖和虚函数的解释可以参考工程中的Main实例 当父类中某函数被...

    C++编程思想习题

    14.8.1构造函数调用次序 14.8.2虚函数在构造函数中的行为 14.9析构函数和虚拟析构函数 14.10小结 14.11练习 第15章 模板和包容器类 15.1包容器和循环子 15.2模板综述 15.2.1C方法 15.2.2Smalltalk方法 15.2.3模板...

    c.c++找工作面试重点结构图-mindmanager

    但仅仅用建立对象的最远派生类的构造函数调用虚基类的构造函数,而该派生类的所有基类中列出的对虚基类的构造函数的调用在执行中被忽略,从而保证对虚基类子对象只初始化一次。 (7) 在一个成员初始化列表中同时出现...

    网二维数组的动态创建和释放.pdf 网负号重载(1).pdf 网负号重载pdf 赋值号“==“重载(1).pdf 赋值号"==

    构造函数可以调用虚函数吗, 析构函数可... 后置加加(1).pdf 后置加加.pdf 网将模板声明为友元.pdf @静态数据成员(1).pdf 静态数据成员.pdf 拷贝构造函数.pdf 类的继承.pdf 类的组合.pdf 模板.pdf 模板的特化(具体化)...

    C语言和C++的重要知识点提炼.rar

    虚函数表的创建和虚函数指针的初始化都是在构造函数中进行的。当编译器发现基类当中有虚函数存在时,就会为每个含有虚函数的类创建一个虚函数表(vtable),该表是一个一维数组,存放的是虚函数的地址,子类中如果...

    05 对象的初始化和清理.rar_C++

    包含const修饰成员函数;this指针的使用;纯虚函数和抽象类;构造函数的分类及调用;...拷贝构造函数调用;虚析构和纯虚析构;友元;运算符重载;多态及多态的三个案例:计算器类、制作饮品、电脑组装。

    零起点学通C++多媒体范例教学代码

    11.10.1 温习调用构造函数实现的类型转换 11.10.2 通过构造函数将变量转换为一个对象的成员变量 11.10.3 通过operator关键字进行转换 11.11什么可以重载,什么不可以重载 第12章 继承 12.1 什么是继承和派生 12.1.1...

    零起点学通C++学习_多媒体范例教学代码

    11.10.1 温习调用构造函数实现的类型转换 11.10.2 通过构造函数将变量转换为一个对象的成员变量 11.10.3 通过operator关键字进行转换 11.11什么可以重载,什么不可以重载 第12章 继承 12.1 什么是继承和派生 ...

    C_C++问题总结

    3.3 构造函数能否为虚函数 3.4 C语言编译全过程 3.5 单例模式 3.5.1 如何实现单例模式 3.5.2 如何实现单例模式 3.6 返回“引用”的格式、好处、注意事项 3.7 指针的表示 3.8 拷贝构造函数的调用时机 3.9 如何确保...

    传智播客_C++基础课程讲义_v1.0.7

    3.3构造函数调用规则研究 6 3.4深拷贝和浅拷贝 6 3.5多个对象构造和析构 6 3.6构造函数和析构函数的调用顺序研究 6 3.7构造函数和析构函数综合练习 6 3.8 对象的动态建立和释放 6 4静态成员变量成员函数 6 4.1静态...

    C++上机实验报告-实验五.docx

    基类构造函数的调用顺序是按照派生类定义时的顺序,而内嵌对象的构造函数调用顺序是按照成员在类C++上机实验报告-实验五全文共7页,当前为第2页。C++上机实验报告-实验五全文共7页,当前为第2页。中声明的顺序。 C++...

Global site tag (gtag.js) - Google Analytics