C++友元(2) - 继承与友元

来源:互联网 发布:站台气候数据 编辑:程序博客网 时间:2024/04/29 09:01

1.基类中的友元函数行为

C++中, 友元是不会继承的。如果基类有一个友元函数,则此函数不会成为子类的友元函数。

例如,下面程序会编译失败,因为函数show()是基类A的友元函数,但无法访问子类B的私有数据。

#include <iostream>using namespace std;class A{  protected:    int x;  public:    A() { x = 0;}    friend void show();};class B: public A{  public:    B() : y (0) {}  private:    int y;};void show(){  B b;  cout << "The default value of A::x = " << b.x;  // 编译失败。无法访问类'B'中的私有数据  cout << "The default value of B::y = " << b.y;}int main(){  show();  return 0;}

编译失败。

2.子类中的友元函数的行为

反之,如果在子类中定义了一个友元函数,则它可以访问基类中的public以及protected数据。
因为子类B是公有继承A的,A中的public以及protected数据可以被B的对象访问。
如下面例子所示:

#include <iostream>using namespace std;class A{protected:     int x;    public:     A() { x = 22; z = 33; }     int z;};class B : public A{public:     B() : y(0) {}     friend void show();private:     int y;};void show(){     B b;     cout << "The default value of A::x = " << b.x << std::endl;     cout << "The default value of A::z = " << b.z << std::endl;     cout << "The default value of B::y = " << b.y << std::endl;}int main(){     show();     return 0;}

输出:
The default value of A::x = 22
The default value of A::z = 33
The default value of B::y = 0

0 0