C++ 为什么子类的子类不能访问其祖先的受保护成员?

C++ 为什么子类的子类不能访问其祖先的受保护成员?,c++,class,C++,Class,我有一类动物,它有一个子类狗,它有一个子类大狗。这类动物有一条受保护的腿。我无法访问BigDog类函数或构造函数中的legs 类动物{ 受保护的: int腿=0; 颜色eyeColor=颜色0,0,0; 公众: 虚拟字符串getSound常量=0; }; 狗类:动物{ 公众: 字符串getSound常量重写{ 弦音=; int legI=腿; 而legI->0{ 声音+=*步*; } 声音+=树皮; 回音; } 狗:动物{ 腿=4; eyeColor=color200128,0; } }; 大狗

我有一类动物,它有一个子类狗,它有一个子类大狗。这类动物有一条受保护的腿。我无法访问BigDog类函数或构造函数中的legs

类动物{ 受保护的: int腿=0; 颜色eyeColor=颜色0,0,0; 公众: 虚拟字符串getSound常量=0; }; 狗类:动物{ 公众: 字符串getSound常量重写{ 弦音=; int legI=腿; 而legI->0{ 声音+=*步*; } 声音+=树皮; 回音; } 狗:动物{ 腿=4; eyeColor=color200128,0; } }; 大狗类:狗{ 公众: //使用dog的初始值设定项 大狗{ 腿=4; } 字符串getSound常量重写{ 弦音=; int legI=腿; 而legI->0{ 声音+=*步*; } 声音+=BOOF BOOF; 回音; } }; 此代码给出错误:“int Animal::legs”在您编写时设置或读取BigDog的legs时受到保护

class Dog : Animal { … };
你真正写的是

class Dog : private Animal { … };
因为用class key class定义的类的默认访问说明符是private,这是一种奇特的说法:如果您有一个类,该类将继承所有私有的内容,除非您明确地说不是这样。私有继承意味着基类的所有受保护和公共成员在派生类中都是私有的。由于狗私下继承了所有动物的东西,大狗再也不能接触到它了,顺便说一句,它也私下继承了所有的狗的东西。你最想写的是

class Dog : public Animal { … };

注意:如果您有一个struct,则默认为public。

当您编写

class Dog : Animal { … };
你真正写的是

class Dog : private Animal { … };
因为用class key class定义的类的默认访问说明符是private,这是一种奇特的说法:如果您有一个类,该类将继承所有私有的内容,除非您明确地说不是这样。私有继承意味着基类的所有受保护和公共成员在派生类中都是私有的。由于狗私下继承了所有动物的东西,大狗再也不能接触到它了,顺便说一句,它也私下继承了所有的狗的东西。你最想写的是

class Dog : public Animal { … };


注意:如果您有一个struct,默认值将是public。

您使用的是私有继承,这意味着每个继承的成员都变成私有的。你想要公共继承权

class Dog : public Animal {
...
class BigDog : public Dog {

请注意此处的关键字public,它确保公共成员保持公共,受保护的成员保持受保护。继承的访问说明符指定任何继承成员的最大可见性,因此当其为私有时,所有内容都将是私有的。而且,与类的成员一样,如果不指定,继承将假定您的意思是私有的。更多信息。

您正在使用私有继承,这意味着每个继承的成员都是私有的。你想要公共继承权

class Dog : public Animal {
...
class BigDog : public Dog {

请注意此处的关键字public,它确保公共成员保持公共,受保护的成员保持受保护。继承的访问说明符指定任何继承成员的最大可见性,因此当其为私有时,所有内容都将是私有的。而且,与类的成员一样,如果不指定,继承将假定您的意思是私有的。更多信息。

您拥有私有继承权。那不是你想要的。你的可能复制品有私人继承权。那不是你想要的。可能是你的复制品