A
が を呼び出しているためですotherA.hello();
。それを呼び出したり、直接コーディングしprivate
たりすることはできませんが、 の子孫 (それ自体を含む) は を呼び出すことができます(子孫は のデータ/メソッドにはアクセスできませんが、 のデータ/メソッドにはアクセスできます)。関連して、の他のインスタンスのデータ/メソッドにもアクセスできます(これは一般に、コピー コンストラクターと代入演算子がどのように機能するかです)。protected
A
A
A
A
private
A
A
private
A
private
A
実際、いくつかの非常に強力な OO 概念の作成を可能にするのは、protected
内でコードを使用する機能です。class
そうは言っても、可能な場合でも内部オブジェクトのprivate
またはprotected
メソッドを呼び出すのは乱用だと思いますが、それらを自分自身に対して直接使用することは、利便性ではなく設計によるものです。
C++ では、項目を実装としてマークし、実装を提供しないことで、 class
es (またはs については s) の抽象的な実装を提供できます。struct
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
(上記の例は実際には多くのユーティリティを提供していませんが、私の言いたいことを示しています)。