class Человек
{
protected:
int кошелёк;
};
class Мужчина : public Человек
{
int fч( Человек& ч );
int fм( Мужчина& м );
};
int Мужчина::fч( Человек& ч ) // 1
{
кошелёк = 100; // Всё в порядке. моё.
int s = ч.кошелёк; // protected member access errorвполне справедливоreturn s;
}
int Мужчина::fм( Мужчина& м ) // 2
{
кошелёк = 100; // Всё в порядке, кошелёк мой собственный
int s = м.кошелёк; //это компилируется. и это НЕПРАВИЛЬНО!кошелёк ЧУЖОЙ !!
// С фига ли я должен иметь доступ к твоему кошельку, только на основании того что мы с тобой оба "Мужчины" ??
return s;
}
class Человек
{
protected:
int кошелёк;
public:
void Человек() { a=3; }
void gч( Человек& ч )
{
ч.кошелёк--; // Даже это не должно компилироваться. не следует лазить в чужой кошелёк!
кошелёк++; // в свой можно
}
};
class Человек
{
private:
int кошелёк;
public:
void Человек() { кошелёк=3; }
void gч( Человек& ч )
{
ч.кошелёк--; // сейчас работает. а не должно ;)
}
};
在你的资料中找到servicedesk。
这里不存在矛盾,否则B就可以访问C.t,如下图所示,而B并不是从C派生出来的。
在你的例子中,B应该可以访问C.t,我认为没有理由禁止它。
你们都很奇怪,你们混淆了类和实例。 我认为同一个类的另一个实例B也不应该有对t的访问。
受保护的字段应该只被自己的(同一B实例的,即这个)访问,而其他实例(甚至同一B类的)应该被关闭......这里让我重新命名一下,以便清楚。
在我看来--两个函数都不应该编译,而不仅仅是第一个。 如果在C++中,第二个函数可以编译并工作--那是C++的刺伤,而不是美德。
简而言之。
你与钱包的比较是不正确的。
我可以给你一个例子,你需要访问被保护的成员,但这与我或你的喜好无关。
如果程序员想禁止什么,他可以自己做,而编译器必须禁止。
如果它有可能干扰程序。
在上面的例子中,B类知道A类的情况,所以它不会在那里乱来。
如果你想禁止它,就把它放在私人部分,或者不要从一个类中继承,或者想出一千种其他方法。
在我看来,两个函数都不应该被编译,而不仅仅是第一个。 如果在C++中,第二个函数可以被编译并工作,那就是C++的缺陷,而不是优点。
那么它的钱包也不会被访问
再一次:仔细区分类(类型)和实例(变量)。 自己的(本)proctored字段可以自由访问,也可以通过继承(与private不同),其他的(同一类的其他变量)一定不能访问。(应该是无法访问的)
.....
在上面的例子中,B类知道A类的情况,所以它不会在那里乱来。
...............
仅仅因为我知道 你有一个钱包,并不是访问它的理由。 对你的钱包,请只通过get()和set()--如果你允许的话(公共:int get(); int set();)。
仅仅因为我知道 你有一个钱包,就没有理由访问它。 对你的--请。 对你的--只能通过get()和set()--如果你允许的话(public: int get(); int set();)。
钱包只是一个特殊情况。而且没有人阻止它被放在私人部分。
在另一种情况下,你可能需要访问 别人的对象的父类变量。
而这要由程序员来决定是否允许。而编译器必须确保程序的正确运行。
我举了一个矛盾的例子......对象是一样的
不存在任何矛盾。如果你通过 "外部接口 "来指代自己,请做好被自己打脸的准备;)
...........,因为在编译的时候,它没有关于对象的信息。
1.钱包只是一个特殊情况。而且没有人阻止它被放在私人部分。
2.在另一种情况下,你可能需要访问 别人的对象的父类变量。
3 而这要由程序员决定是否允许。
4.并由编译器来确保程序的正确运行。
1.把它放在私人部分不会改变任何事情,如果
它将继承,这是显而易见的。
2.需要做的事情非常少。理由只有在访问你自己的副本时才能获得。
3.所以让他决定。 正确。;)
4.这就是整个问题: 究竟什么 算作 "正确的工作"。