/* * 虚基类及其派生构造函数.cpp * * Created on: 2013-10-20 * Author: Administrator */ #include<iostream> using namespace std; /* * 如果虚基类中有带参数的构造函数,在整个继承结构中,直接、间接继承虚基类的 * 所有派生类都必须在构造函数的成员初始化列表中列出对虚基类数据成员的初始化 */ class Base0 { public: Base0(int n) { nV = n; } void fun() { cout << "在Base0的成员函数fun()中" << ", 数据成员nV = "; } int nV; }; class Base1 : virtual public Base0 { public: Base1(int a) : Base0(a) { } int nV1; }; class Base2 : virtual public Base0 { public: Base2(int a) : Base0(a) { } int nV2; }; class BaseC : public Base1, public Base2 { public: BaseC(int a) : Base1(a),Base2(a) , Base0(a) //这里的顺序不重要 { nVd = a; } int nVd; void fund() { cout << "在BaseC的成员函数fun()中" << ", 数据成员nVd = "; } }; int main(void) { BaseC c(3); Base1 b(5); b.fun(); cout << b.nV << endl; c.fun(); cout << c.nV << endl; cout << "c 对象的数据成员nVd = " << c.nVd << endl; c.nV = 2; cout << "执行完c.nV = 2; 后c.nV =" << c.nV << endl; return 0; } /* * 在上述程序中,派生类对虚基类中的数据成员都是进行了初始化,对于虚基类中的nV,系统将本着 * 最远派生类的原则对其初始化,即是在创建设一个对象时,若该对象中包含有从虚基类中继承来的成员 * 则虚基类的成员将由最远派生类的构造函数通过调用虚基类的构造函数进行初始化。上例中BaseC就是 * 最远派生类 */ // 输出: // 在Base0的成员函数fun()中, 数据成员nV = 5 // 在Base0的成员函数fun()中, 数据成员nV = 3 // c 对象的数据成员nVd = 3 // 执行完c.nV = 2; 后c.nV =2 |
|