鱼C论坛

 找回密码
 立即注册
查看: 2046|回复: 10

求助 虚继承 一点头绪都没有

[复制链接]
发表于 2014-4-28 09:18:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
设计一个许继承类Bsae,该类中包含姓名、年龄两个私有的数据成员以及相关的成员函数,由Base派生处领导类,Leader,包括职务、部门这两个私有数据成员以及相关的成员函数。再由Base派生出工程师类Engineer,包含职称和专业这两个私有的数据成员及相关的成员函数。再由Leader和Engineer这两个类派生出主任工程师Chairman,并测试所设计的类.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-28 09:57:37 | 显示全部楼层

回帖奖励 +10 鱼币

在建立Leader类和Engineer类声明继续虚基类Base,其他就是普通的类定义啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-28 17:17:04 | 显示全部楼层
已经写完了  还是谢谢哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-28 21:06:17 | 显示全部楼层

Base里的私有成员    Leader和Engineer继承了后私有成员不可见啊  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-28 21:39:42 | 显示全部楼层
哪种继承下派生类都不继承基类的私有成员
So?
你在为派生类初始化的时候先调用的是虚基类的构造函数。因此你可以用继承下来的基类的成员函数访问基类的私有成员。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-28 22:00:28 | 显示全部楼层
sidfate 发表于 2014-4-28 21:39
哪种继承下派生类都不继承基类的私有成员
So?
你在为派生类初始化的时候先调用的是虚基类的构造函数。因 ...

我写了  但是私有成员那部分还是不可见  用友元也不行呢  你方便加我QQ吗  方便点  我的QQ:512712020
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-28 22:05:45 | 显示全部楼层
把你写的贴一份出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-28 22:15:49 | 显示全部楼层
sidfate 发表于 2014-4-28 22:05
把你写的贴一份出来

#include <iostream>
#include <string>
using namespace std;
class Base
{
    friend class Leader;
    friend class Engineer;
    string name;
    int age;
public:
    Base(string na,int ag):name(na),age(ag)
        {}

    void Printf1()
        {
                cout<<"Base:"<<endl;
                cout<<"name:"<<name<<endl;
                cout<<"age:"<<age<<endl;
        }
};
class Leader:virtual public Base
{
    string job;
    string depart;
public:
    Leader(string jo,string de,string na,int ag):Base(na,ag)
{
    job=jo;
    depart=de;
}
    void Printf2()
        {
                cout<<"Leader:"<<endl;
                cout<<"job:"<<job<<endl;
                cout<<"depart:"<<depart<<endl;
        }

};
class Engineer:virtual public Base
{
    string profession;
    string major;
public:
    Engineer(string pro,string ma,string na,int ag):Base(na,ag)
    {
        profession=pro;
        major=ma;
    }
    void Printf3()
        {
                cout<<"Engineer:"<<endl;
                cout<<"profession:"<<profession<<endl;
                cout<<"major:"<<major<<endl;
        }

};
class Chairman:public Leader,public Engineer
{

};

int main()
{
     Base b1("李",20);
    b1.Printf1();
     Engineer e1("computer","program","li",20);
         e1.Printf3();
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-29 09:53:13 | 显示全部楼层
把声明友元的部分去掉吧,没用。

void Printf3()
        {
                Printf1();     
                cout<<"Engineer:"<<endl;
                cout<<"profession:"<<profession<<endl;
                cout<<"major:"<<major<<endl;
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-29 10:52:47 | 显示全部楼层
过来学习学习!,,,,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-29 22:35:15 | 显示全部楼层
sidfate 发表于 2014-4-29 09:53
把声明友元的部分去掉吧,没用。

void Printf3()

#include <iostream>
#include <string>
using namespace std;
class Base
{
    string name;
    int age;
public:
    Base(string na,int ag):name(na),age(ag)
        {}

    void Printf()
        {
                cout<<"Base:"<<endl;
                cout<<"name:"<<name<<endl;
                cout<<"age:"<<age<<endl;
        }
};
class Leader:virtual public Base
{
    string job;
    string depart;
public:
    Leader(string jo,string de,string na,int ag):Base(na,ag)
{
    job=jo;
    depart=de;
}
    void Printf()
        {
                Base::Printf();
                cout<<"Leader:"<<endl;
                cout<<"job:"<<job<<endl;
                cout<<"depart:"<<depart<<endl;
        }

};
class Engineer:virtual public Base
{
    string profession;
    string major;
public:
    Engineer(string pro,string ma,string na,int ag):Base(na,ag)
    {
        profession=pro;
        major=ma;
    }
    void Printf()
        {
                Base::Printf();
                cout<<"Engineer:"<<endl;
                cout<<"profession:"<<profession<<endl;
                cout<<"major:"<<major<<endl;
        }

};
class Chairman:public Leader,public Engineer
{
public:
    Chairman(string pro,string ma,string jo,string de,string na,int ag):Base(na,ag),Leader(pro,ma,na,ag),Engineer(jo,de,na,ag)
        {
        }
        void Printf()
        {
            
                Leader::Printf();
                Engineer::Printf();
        }
   
};

int main()
{
     Engineer e1("职业","职务","李",20);
         e1.Printf();
         Leader l1("职称","部门","李",20);
         l1.Printf();

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 05:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表