分享

虚基类及其派生构造函数.cpp

 望穿墙 2013-12-08
/*
 * 虚基类及其派生构造函数.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


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多