C++ 朋友 classes 可以访问其基 class 的所有成员吗?

C++ Can friends classes access all of the members of its base class?

我的理解是朋友class可以访问基地的所有成员(包括数据成员)。但是,使用此代码:

class Animal {                                                                                                                                                                                            
  string _name;                                                                                                                                                                                           
  Animal(){};                                                                                                                                                                                             
  Animal(const string & n, const string & t, const string & w); 
  friend class Duck;                                                                                                                                                                                      
};                                                                                                                                                                                                        

Animal::Animal(const string & n) : _name(n) {                                                                                                     
}                                                                                                                                                                                                         


class Duck: public Animal {                                                                                                                                                                               
public:                                                                                                                                                                                                   
  Duck(const string n) : Animal(n){};                                                                                                                                                    
};                                                                                                                                                                                                        


int main(int argc, char *argv[])                                                                                                                                                                          
{                                                                                                                                                                                                         
  Duck donald("Donny");                                                                                                                                                                                   
  printf("The donlad ran %s\n", donald._name.c_str());                                                                                                                                                 
  return 0;                                                                                                                                                                                               
}

我得到error: '_name' is a private member of 'Animal'

为什么 friend class Duck 不能访问基地 class Animal 的所有成员?

  1. friend继承无关.

  2. 您收到错误是因为 main() 而不是 Duck 试图访问 Animal 的私有 _name 成员。使 Duck 成为 Animalfriend 授予访问 Duck 自己的方法的权限,而不是 main().

错误是你在main

中调用printf("The donlad ran %s\n", donald._name.c_str());的地方

您无法通过 class 实例(在本例中为 donald)访问 _name,因为 _nameprivate。由于 friend 指定,_name 可从 Duck class 中访问,但在 main

中不可访问