【问题标题】:Caveats with "protected versus private" [duplicate]“受保护与私有”的警告[重复]
【发布时间】:2014-01-13 05:15:58
【问题描述】:

我知道私有和受保护的定义,以及它们的区别。但是,当我继续与他们一起测试每种不同的场景时,我并没有得到一致/预期的行为。这是让我感到困惑的段落(来自 21 天内自学 C++ :))

总共存在三个访问说明符:public、protected 和 私人的。如果一个函数有你的类的一个对象,它可以访问所有 公共成员数据和功能。反过来,成员函数, 可以访问自己类的所有私有数据成员和函数 以及任何类的所有受保护数据成员和函数 他们推导出来。

为了具体一点,我写了一段代码来看看(代码在问题语句的下方): 1- 如果Frisky 和Boots,Cat 类的两个实例,可以看到彼此的私有数据。通过“看到”,我的意思是拥有将另一只猫作为其参数并能够设置/获取其私有数据的成员函数。声称他们应该是,我可以确认。

2- 与“看到”的含义相同,猫“Frisky”中的成员函数可以将哺乳动物的实例(例如“人类”)作为参数,并设置/获取其受保护的数据吗?我从上面的声明中了解到应该是的,但是代码不会编译。它抱怨它受到保护。

如果我理解错了,上一段的实际含义是什么?任何帮助表示赞赏,谢谢!

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;
}

【问题讨论】:

    标签: c++ private protected


    【解决方案1】:

    您看到的是继承的正确行为。同级可以看到彼此的privateprotected 成员,但他们看不到父类的privateprotected 成员。

    我给你两个参考:

    Cat 的实例可以看到Catprivateprotected 成员,因为大概Cat 中的逻辑完全理解该级别的类的约束,并将维护所有的类不变量。

    Cat,尽管是Mammal,但并不知道Mammal 的实现,因此看不到它的private 成员。这个想法是 Mammal 已经封闭了它的实现,包括从它继承的类。

    Cat 还可以在Cat 的另一个实例中看到它从Mammal 继承的protected 成员(或从Cat 继承的东西)。也就是说,如果您将Cat(或从Cat 派生的东西)传递给Cat 的成员函数之一,它可以看到它从Mammal 继承的protected 成员,以及私有Cat 的成员。

    但是,它无法看到随机Mammal 的受保护成员。如果您只是将Mammal&amp;Mammal* 传递给Cat 中的方法,那么Cat 只知道它们有一个共同的祖先Mammal。如果另一个类从Mammal 继承,它可能会以Cat 未预料到的方式使用Mammalprotected 成员。因此,您无法从Cat 中访问Mammal 对象的protected 成员。

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

    【讨论】:

    • 非常感谢您的全面回复。您的解释完全有道理,我认为我的困惑是我从书中引用的这句话:“反过来,成员函数可以访问它们自己类的所有私有数据成员和函数以及任何类的所有受保护数据成员和函数他们从中得到的。”根据您的解释和我的理解,第二个说法是错误的,您同意吗?还是我仍然没有理解这句话的第二部分的意思?您似乎声称“......以及从它们派生的任何类的所有受保护数据成员和函数。”
    • @user3133942 :我认为只要您仅将其应用于同一类的实例,该语句就会正确。 (本例中为 Cat 的实例。)
    猜你喜欢
    • 2017-06-29
    • 2017-02-22
    • 2011-06-19
    • 2011-03-15
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 2016-07-07
    • 2015-08-11
    相关资源
    最近更新 更多