[英]Why does the first statement here not violate protected access while the second one does?
我正在研究这段代码:
#include <iostream>
class A
{
public:
A() {};
void fox(A& otherA) { otherA.hello(); }
protected:
void hello() {std::cout << "hello" << std::endl;}
};
A a1,a2;
int main(void)
{
a1.fox(a2);
a1.hello();
}
对于说a1.fox(a2)
会如何编译而说a1.hello()
不会如何编译有些困惑。 我会认为它会因为打破,而我可以叫保护,从一个类中的私有函数...让我做到这一点的上otherA
对象意味着我必须要知道,我从一个构件内调用它的它的自己的课。 为什么/如何运作?
保护不是按实例的访问控制,而是按类的访问控制。
main()
(不在任何类中)根本不能调用任何类的私有方法或受保护的方法; 因此它无法调用a1.hello()
。
另一方面, A::fox(A&)
的实现位于类A
,因此它可以在其自身以及该类的其他实例上调用其私有和受保护的方法。
因为A
正在调用otherA.hello();
。 您不能直接调用它的private
或protected
代码,但是A
后代(包括A
本身)可以调用A
(后代不能访问A
的private
数据/方法,但是A
可以访问A
的private
数据/方法)。 与此相关的, A
也可以访问private
的其他实例的数据/方法A
(这通常是拷贝构造函数和赋值操作符如何工作)。
实际上,正是在class
中使用protected
代码的能力才能创建一些非常强大的OO概念。 话虽如此,我认为即使在可能的情况下调用内部对象的private
或protected
方法也是一种滥用,但是希望通过设计而不是方便的方式直接针对自己使用它们。
在C ++中,可以通过将项目标记为virtual
而不提供实现来提供class
es(或相应的struct
的抽象实现。
class A
{
public:
void set_value(const std::string &value)
{
if (is_valid(value))
{
this->value = value;
}
}
const std::string &get_value() const
{
return value;
}
protected:
virtual boolean is_valid(const std::string &value) const = 0;
private:
std::string value;
}
然后
class B : public A
{
protected:
virtual boolean is_valid(const std::string &value) const
{
return value != "abc";
}
}
请注意, A
是为继承功能而设置的,并且它的构建旨在预期将提供它(上面的示例确实并未提供很多实用程序,但确实显示了我的意思)。
C ++中的访问控制在类级别。 不是实例级别。
编译器可能无法知道otherA
是否实际上是同一实例。 您需要运行时支持来实际确定实例的身份以提供这种访问控制。
除了这带来的性能问题之外,C ++的目标是在编译时而不是执行时捕获错误。 正如stroustrup所说,数据封装和类型安全功能不能防止某人进行欺诈(当程序无中介访问所有分配的内存时)。
现在,为什么不进行运行时检查就可以解决该问题。 解剖学可能会有所帮助-因为作为课程的实施者,您不会抢劫自己的房子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.