| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2588 人关注过本帖
标题:友元关系的继承
只看楼主 加入收藏
独孤剑魔
Rank: 1
等 级:新手上路
帖 子:103
专家分:0
注 册:2008-8-5
收藏
 问题点数:0 回复次数:8 
友元关系的继承
我在书中看到,友元关系是不能继承的。可是我在测试时却发现不同。请大家看看:
class Fu
{
    friend class FZ;
protected:
    string name;
private:
    int age;
public:
    void shuchu(string n="Fu",int a=50)
    {
        name=n;
        age=a;
        cout<<"基类"<<name<<"===="<<age<<endl;
    }
};
class Zi : public Fu
{
protected:
    int xingqu;
};
class FZ
{
public:
    void mem(Fu f)
    {
        cout<<f.age<<endl;
    }
    void mem(Zi z)
    {
        cout<<z.age<<endl;
    }
};
void main()
{
    Fu f;
    Zi z;
    f.shuchu();
    z.shuchu();
    FZ fz;
    fz.mem(f);//这里输出50按说正常,因为友元可以访问此类的任何成员
    fz.mem(z);//但是这里也输出了50,为什么呢?难道书中有错还是C++弥补了这一不足或者其他什么的?我看的是C++ Primer!
}
输出结果:
基类Fu====50
基类Fu====50
50
50
Press any key to continue

[[it] 本帖最后由 独孤剑魔 于 2008-11-4 10:11 编辑 [/it]]
搜索更多相关主题的帖子: 关系 
2008-11-04 10:10
独孤剑魔
Rank: 1
等 级:新手上路
帖 子:103
专家分:0
注 册:2008-8-5
收藏
得分:0 
是不是这里 子类被识别成 基类了?
2008-11-04 10:19
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
你看看这个
#include"iostream"
#include"string"
using namespace std;
class Fu
{
    friend class FZ;
protected:
    string name;
private:
    int age;
public:
    void shuchu(string n="Fu",int a=50)
    {
        name=n;
        age=a;
        cout<<"基类"<<name<<"===="<<age<<endl;
    }
};
class Zi : public Fu
{
    int xingqu;
public:
    Zi(){xingqu=0;};
};
class FZ
{
public:
    void mem(Fu f)
    {
        cout<<f.age<<endl;
    }
    void mem(Zi z)
    {
        cout<<z.xingqu<<endl;
    }
};
void main()
{
    Fu f;
    Zi z;
    f.shuchu();
    z.shuchu();
    FZ fz;
    fz.mem(f);
    fz.mem(z);
}

学习需要安静。。海盗要重新来过。。
2008-11-04 10:23
独孤剑魔
Rank: 1
等 级:新手上路
帖 子:103
专家分:0
注 册:2008-8-5
收藏
得分:0 
嗯,谢谢,不过,书上给出的就是访问那个 子类的age时出错。
age虽然是继承过来的,基类和子类都有age,但是子类中的age是单独的,并且子类也没有授予FZ访问权限.
2008-11-04 10:36
独孤剑魔
Rank: 1
等 级:新手上路
帖 子:103
专家分:0
注 册:2008-8-5
收藏
得分:0 
基类中的 age和name分别是 私有和受保护的,我在继承时使用 public标号,所以到了子类按说也是私有和受保护的啊。
2008-11-04 10:39
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
你的age是私有的,是不可以继承的...友员在这展示的特性就是可以访问从基类继承的属性,如果是派生类的私有属性是不可以访问的,所以说成不可继承是没什么问题的吧

学习需要安静。。海盗要重新来过。。
2008-11-04 10:46
独孤剑魔
Rank: 1
等 级:新手上路
帖 子:103
专家分:0
注 册:2008-8-5
收藏
得分:0 
[bo][un]sunkaidong[/un] 在 2008-11-4 10:46 的发言:[/bo]

你的age是私有的,是不可以继承的...友员在这展示的特性就是可以访问从基类继承的属性,如果是派生类的私有属性是不可以访问的,所以说成不可继承是没什么问题的吧

我急糊涂了,我知道private是不可以继承。
不过这个问题已经解决了,vc6.0没有完全支持c++标准。所以才出现上述问题。
2008-11-04 11:07
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
你看的是哪一个版本的primer..我也用的是vc6.0..2005没试过

学习需要安静。。海盗要重新来过。。
2008-11-04 11:39
独孤剑魔
Rank: 1
等 级:新手上路
帖 子:103
专家分:0
注 册:2008-8-5
收藏
得分:0 
第四版啊。你的无法通过编译么?
2008-11-04 14:26
快速回复:友元关系的继承
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.058851 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved