我知道私有和受保护的定义,以及它们的区别。但是,当我继续使用它们来测试每个不同的场景时,我没有得到一致/预期的行为。这段话让我感到困惑(从21天开始自学C ++ :))
总共存在三种访问说明符:public,protected和 私人的。如果某个函数具有您的类的对象,则它可以访问所有对象 公共成员的数据和功能。成员函数反过来, 可以访问自己类的所有私有数据成员和函数 以及所有受保护的数据成员和任何类的功能 他们派生出来。
更具体地说,我编写了一个代码来查看(代码在问题陈述下面): 1-如果Frisky和Boots,Cat类的两个实例,可以看到彼此的私人数据。通过“see”ing,我的意思是让成员函数将另一只猫作为其参数,并能够设置/获取其私有数据。声称他们应该是,我可以确认。
2-对于“see”ing具有相同的含义,可以将猫“Frisky”中的成员函数作为参数作为Mammal的一个实例,说“Human”,并设置/获取其受保护的数据?我从上面的说法中理解是的,它应该是,但代码将无法编译。它抱怨它受到保护。
如果我理解这个错误,上段的实际含义是什么?感谢任何帮助,谢谢!
using namespace std;
class Mammal
{
public:
int myNumFeet;
void setMyNumVertebras(int);
protected:
int myNumVertebras;
};
class Cat : public Mammal
{
public:
void tellHisAge(Cat);
void tellHisNumVertebras(Mammal);
void setMyAge(int);
private:
int myAge;
int myWeight;
};
int main()
{
Cat Frisky;
Frisky.setMyAge(3);
Frisky.setMyNumVertebras(23);
Cat Boots;
Boots.setMyAge(4);
Boots.setMyNumVertebras(23);
Mammal Human;
Human.setMyNumVertebras(33);
Frisky.tellHisAge(Boots);
Frisky.tellHisNumVertebras(Human);
return 0;
}
void Cat::tellHisAge(Cat Boots)
{
cout << Boots.myAge <<endl;
}
void Cat::setMyAge(int age)
{
myAge = age;
}
void Mammal::setMyNumVertebras(int num)
{
myNumVertebras = num;
}
void Cat::tellHisNumVertebras(Mammal Human)
{
cout<< myNumVertebras <<endl;
}
答案 0 :(得分:1)
您所看到的是继承的正确行为。对等方可以看到彼此的private
和protected
成员,但他们无法看到父类的private
和protected
成员。
我为您提供了两个参考资料:
Cat
的实例可以查看private
的{{1}}和protected
成员,因为Cat
中的逻辑可能完全理解Cat
的约束该级别的类,并将维护所有类不变量。
Cat
,尽管是Mammal
,但并不了解Mammal
的实施情况,因此无法看到其private
成员。这个想法是Mammal
已经封锁了它的实现,包括从它继承的类。
Cat
还可以在protected
的另一个实例(或继承自Mammal
的内容)中看到它从Cat
继承的Cat
成员。也就是说,如果您将Cat
(或从Cat
派生的内容)传递给Cat
的某个成员函数,则可以看到它继承自protected
成员Mammal
{1}}以及Cat
的私人成员。
但是,它无法看到随机Mammal
的受保护成员。如果您只是将Mammal&
或Mammal*
传递给Cat
中的某个方法,Cat
所知道的就是他们有一个共同的祖先Mammal
。如果另一个类继承自Mammal
,则它可能会以protected
不期望的方式使用Mammal
Cat
成员。因此,您无法从protected
内访问Mammal
对象的Cat
成员。
受保护的成员是一些最令人烦恼的成员,因为它们代表了基类和没有抽象的派生类之间非常有限的接口。它们本身就很脆弱。请参阅上面的第一个链接以获得更一般的解释。