友元继承的疑问

「已注销」 2007-05-09 01:54:35
有这种说法:
a friend function is not inherited. i.e. when a base class includes a
friend function, that friend is not a friend of a derived class
于是在vc中试运行如下代码

#include <iostream>
using namespace std;

class A
{

public:
int x,y;

friend ostream& operator<<(ostream& os, A& a)
{
os<< "x="<<a.x<<";y="<<a.y<<endl;
return os;
}
};


class B :public A
{
};


int main(void)
{
B b;
cout<<b;
return 0;
}

并没有出现编译问题,那么是否违反了上面的规则呢?不知道c++的规定究竟是怎样的,上哪里可以查到呢?
...全文
205 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2007-07-06
  • 打赏
  • 举报
回复
error C2248: 'B::z' : cannot access private member declared in class 'B'
说明了没有被B继承
晨星 2007-05-09
  • 打赏
  • 举报
回复
你想用编译器验证一下friend不被继承这个事实,可以这样做:

#include <iostream>
using namespace std;

class A {
public:
virtual ~A();
friend ostream& operator<<(ostream& os, A& a);
private:
int x,y;
};


class B : public A {
private:
int z;
};

class C : public A {};

ostream& operator<<(ostream& os, A& a) {
os<< "x=" << a.x << ";y=" << a.y << endl;

if(B* p = dynamic_cast<B*>(&a)) {
os << p->z << endl;
}

return os;
}

int main() {
cout << B();
return 0;
}
晨星 2007-05-09
  • 打赏
  • 举报
回复
不过你写的例子也有问题,x和y竟然都是public的,呵呵。
当然,这不是关键。
晨星 2007-05-09
  • 打赏
  • 举报
回复
没有违反,这里可以的原因是:B类型的对象可以赋给A类型的引用。而对于你的那个operator<<,它所看到的仍然只是个A类型的引用,它根本不知道当前引用的对象并不是A类型的,而是A的派生类的。

64,644

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧