派生类的朋友重载运算符和基本成员访问

时间:2019-03-01 13:18:01

标签: c++ c++11

我知道朋友重载运算符可以访问与他们成为朋友的类的私有成员,但是访问他们朋友的基类成员有什么规则?

我做了如下所示的测试,发现派生类的一个朋友重载运算符可以访问基类的受保护成员。朋友函数不是不是与他们成为朋友的类的一部分,为什么他们能够像访问派生类的成员函数一样访问基类的受保护成员?

#include <iostream>
#include <string>

using namespace std;

class Animal {
    protected:
    string name;
    int age;

    public:
    Animal(string, int);
};

Animal::Animal (string n, int a) {
 name = n;
 age = a;
}

class Mouse : public Animal {

friend ostream& operator<< (ostream& out, const Mouse& obj);
private:
   double tailLength;
   double whiskersLength;

public:
   Mouse(string, int, double, double);
};

Mouse::Mouse (string n, int a, double t, double w) : Animal(n, a) {
    tailLength = t;
    whiskersLength = w;
}

ostream& operator<< (ostream& out, const Mouse& obj) {
    out << obj.name; //no error, why is this allowed?
    return out;
}

int main() {
    Mouse m1("nic", 2, 2.5, 3.5);
    cout << m1 << endl;
    cout << m1.name << endl; //error as expected

   return 0;
}

1 个答案:

答案 0 :(得分:0)

这是因为在派生类protected中可以访问基类name的{​​{1}}成员Animal,并且由于重载的Mouse是{ {1}}的派生类,它将能够访问其所有成员。

但是在operator<<函数中,您试图在基类和派生类之外访问friend类的main()成员,这是不允许的。