“保护与私人”的注意事项

时间:2013-12-25 06:31:03

标签: c++ private protected

我知道私有和受保护的定义,以及它们的区别。但是,当我继续使用它们来测试每个不同的场景时,我没有得到一致/预期的行为。这段话让我感到困惑(从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;
}

1 个答案:

答案 0 :(得分:1)

您所看到的是继承的正确行为。对等方可以看到彼此的privateprotected成员,但他们无法看到父类的privateprotected成员。

我为您提供了两个参考资料:

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成员。

受保护的成员是一些最令人烦恼的成员,因为它们代表了基类和没有抽象的派生类之间非常有限的接口。它们本身就很脆弱。请参阅上面的第一个链接以获得更一般的解释。