まず、親クラス。
class ParentClass { private: virtual void func1() { std::cout << "Parent private func1" << std::endl; } protected: virtual void func2() { std::cout << "Parent protected func2" << std::endl; } public: virtual void func3() { std::cout << "Parent public func3" << std::endl; } public: virtual ~ParentClass() {} virtual void call() { func1(); func2(); func3(); } };private, protected, public の 3 種類のメソッドと、それらを呼び出すメソッドを作成。
子クラス1 は public に変更。
class Child1Class : public ParentClass { public: virtual void func1() { std::cout << "Child1 private -> public func1" << std::endl; } virtual void func2() { std::cout << "Child1 protected -> public func2" << std::endl; } virtual void func3() { std::cout << "Child1 public func3" << std::endl; } virtual ~Child1Class() {} };シンタックスエラーは起きない。
子クラス2 は protected に変更。
class Child2Class : public ParentClass { protected: virtual void func1() { std::cout << "Child2 private -> protected func1" << std::endl; } virtual void func2() { std::cout << "Child2 protected func2" << std::endl; } virtual void func3() { std::cout << "Child2 protected -> protected func3" << std::endl; } public: virtual ~Child2Class() {} };これもシンタックスエラーは起きない。
子クラス3 は private に変更。
class Child3Class : public ParentClass { private: virtual void func1() { std::cout << "Child3 private func1" << std::endl; } virtual void func2() { std::cout << "Child3 protected -> private func2" << std::endl; } virtual void func3() { std::cout << "Child3 public -> private func3" << std::endl; } public: virtual ~Child3Class() {} };これもシンタックスエラーは起きない。
実行してみると、
ParentClass* p = new ParentClass(); p->call(); std::cout << "----------" << std::endl; delete p; Child1Class* c1 = new Child1Class(); c1->call(); std::cout << "----------" << std::endl; delete c1; Child2Class* c2 = new Child2Class(); c2->call(); std::cout << "----------" << std::endl; delete c2; Child3Class* c3 = new Child3Class(); c3->call(); delete c3;結果は、
Parent private func1 Parent protected func2 Parent public func3 ---------- Child1 private -> public func1 Child1 protected -> public func2 Child1 public func3 ---------- Child2 private -> protected func1 Child2 protected func2 Child2 protected -> protected func3 ---------- Child3 private func1 Child3 protected -> private func2 Child3 public -> private func3
全てのパターンで特に制限なく変更出来ている。
Java とかと逆の制限があったような気がするが、気のせいだったか。
何か間違っている可能性も・・・
Cygwin g++ (GCC) 4.5.3
Visual C++ 2010
でコンパイル。 いくつかの言語で試してみたものの、結果まぁ言語仕様書を読めよということで。
0 件のコメント:
コメントを投稿