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