因为A
正在调用otherA.hello();
. 您不能直接调用它private
或protected
编码,但是 的后代A
,包括A
它自己,可以调用A
(后代不能访问A
的private
数据/方法,但A
可以访问A
的private
数据/方法)。相关地,A
还可以访问private
其他实例的数据/方法A
(这通常是复制构造函数和赋值运算符的工作方式)。
事实上,正是在 OO 中使用protected
代码的能力class
使得创建一些非常强大的 OO 概念成为可能。话虽如此,我认为即使在可能的情况下调用内部对象private
或protected
方法也是一种滥用,但希望直接对自己使用它们是设计而不是方便。
在 C++ 中,您可以通过将项目标记为而不提供实现来提供class
es(或struct
s )的抽象实现。virtual
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
是为了继承功能而设置的,并且它是为了预期它被提供而构建的(假设上面的示例并没有真正提供很多实用程序,但它确实说明了我的意思)。