C++Access Control Modifiers/C++アクセス制御子
詳細
I saw many debates on the web about the access control modifier. And I also have some confusion although I have never used other derive method than "public". And I believe only the compiler will tell you the truth:
ネット上でC++アクセス制御子に関する質問がたくさんあるのを見て、自分も少しぼんやりしています.自分は実際の工事でpublic以外の継承を使ったことがありませんが.どんなに多くの議論があっても、コンパイラに事実を教えてもらうほうがいいです.
So: the public/protected/private modifier for field or method declaration controls the member's access in its derived class. the public/protected/private modifier for inheriting modifies the access defined by the above rule to the modifier you used here. the modification made by the above rule only happens if the it makes the member less accessible
結論: public/protected/privateがフィールドまたはメソッドの宣言に使用されるときに制御されるのは、そのサブクラスにおけるメンバーのアクセス権 public/protected/privateが関係を継承するために使用されるときに、この宣言のアクセス権を変更することができます.ここで指定した修飾子 の変更は、この変更によってメンバーのアクセス権が「より小さく」なる場合にのみ行われます. が発生します
I saw many debates on the web about the access control modifier. And I also have some confusion although I have never used other derive method than "public". And I believe only the compiler will tell you the truth:
ネット上でC++アクセス制御子に関する質問がたくさんあるのを見て、自分も少しぼんやりしています.自分は実際の工事でpublic以外の継承を使ったことがありませんが.どんなに多くの議論があっても、コンパイラに事実を教えてもらうほうがいいです.
// NOTICE: the lines commented out below can get compiled!
class B {
public:
void public_foo() {
cout << "public_foo" << endl;
}
protected:
void protected_foo() {
cout << "protected_foo" << endl;
}
private:
void private_foo() {
cout << "private_foo" << endl;
}
};
class D1 : public B {
public:
void test () {
B::public_foo();
B::protected_foo();
// B::private_foo();
}
};
class D2 : protected B {
public:
void test () {
B::public_foo();
B::protected_foo();
// B::private_foo();
}
};
class D3 : private B {
public:
void test () {
B::public_foo();
B::protected_foo();
// B::private_foo();
}
};
class DD1 : public D1 {
public:
void test_inherits () {
B::public_foo();
B::protected_foo();
// B::private_foo();
}
};
class DD2 : public D2 {
public:
void test_inherits () {
B::public_foo();
B::protected_foo();
// B::private_foo();
}
};
class DD3 : public D3 {
public:
void test_inherits () {
// B::public_foo();
// B::protected_foo();
// B::private_foo();
}
};
int main(int argc, const char *argv[])
{
DD1 dd1;
dd1.public_foo();
// you can't change the originally protected to public
// with public inheritance
// dd1.protected_foo();
// nor the private ones
// dd1.private_foo();
DD2 dd2;
// but you can change a public to protected
// dd2.public_foo();
DD3 dd3;
// DD3 has everthing tagged with private
// you have nothing to do with it
return 0;
}
So:
結論: