在學習c++的過程中,也曾經學習java,就發現java有類的嵌套,而看的c++的書,從來沒有哪個講c++的類可以嵌套,於是就試了一下,看是否c++可以嵌套類(編譯環境vc++6.0)
於是有了下面的代碼:
1 #include <iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 A(){ 7 cout<<"this a"<<endl; 8 } 9 ~A(){cout<<"a dead"<<endl;} 10 class B 11 { 12 public: 13 B(){cout<<"this b"<<endl;} 14 ~B(){cout<<"b dead"<<endl;} 15 }; 16 B b; 17 }; 18 class c:public A 19 { 20 }; 21 int main(int argc, char * argv[]) 22 { 23 A a; 24 return 0; 25 }
結果是正確的,那麼看來c++是支持嵌套類的,至少vc++6.0是支持的
那麼B類是否可以使用呢?於是有了下面的代碼:
1 #include <iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 A(){ 7 cout<<"this a"<<endl; 8 } 9 void getA(){cout<<"i am getA()"<<endl;} 10 ~A(){cout<<"a dead"<<endl;} 11 class B 12 { 13 public: 14 B(){cout<<"this b"<<endl;} 15 ~B(){cout<<"b dead"<<endl;} 16 void getB(){cout<<"i am getB()"<<endl;} 17 18 }; 19 B b; 20 }; 21 int main(int argc, char * argv[]) 22 { 23 A a; 24 a.b.getB(); 25 A::B b; 26 b.getB(); 27 return 0; 28 }
結果能成功調用getB()方法,著可以間接證明這個類正的被正確識別了,好了,那我們看是否B能繼承別的類呢?於是有了下面的代碼:
1 #include <iostream> 2 using namespace std; 3 class A 4 { 5 public: 6 A(){ 7 cout<<"this a"<<endl; 8 } 9 void getA(){cout<<"i am getA()"<<endl;} 10 ~A(){cout<<"a dead"<<endl;} 11 class B:public A 12 { 13 public: 14 B(){cout<<"this b"<<endl;} 15 ~B(){cout<<"b dead"<<endl;} 16 void getB(){cout<<"i am getB()"<<endl;} 17 18 }; 19 B b; 20 }; 21 22 int main(int argc, char * argv[]) 23 { 24 A a; 25 a.b.getB(); 26 A::B b; 27 b.getD(); 28 return 0; 29 }
好了結果說A未定義,好吧,那我們從定義一個類,如下:
1 #include <iostream> 2 using namespace std; 3 class D 4 { 5 public: 6 void getD() 7 { 8 cout<<"i am getD()"<<endl; 9 } 10 }; 11 class A 12 { 13 public: 14 A(){ 15 cout<<"this a"<<endl; 16 } 17 void getA(){cout<<"i am getA()"<<endl;} 18 ~A(){cout<<"a dead"<<endl;} 19 class B:public D 20 { 21 public: 22 B(){cout<<"this b"<<endl;} 23 ~B(){cout<<"b dead"<<endl;} 24 void getB(){cout<<"i am getB()"<<endl;} 25 26 }; 27 B b; 28 }; 29 int main(int argc, char * argv[]) 30 { 31 A a; 32 a.b.getB(); 33 a.getA(); 34 a.b.getD(); 35 A::B b; 36 b.getB(); 37 b.getD(); 38 return 0; 39 }
結果也是正確的,看來類B是可以繼承其他類的,也有那些繼承關系。
結論:
我們分析到c++是可以進行類嵌套的,並且可以像正常類一樣操作它,除了不能繼承嵌套它的類,目前還沒發現有其它特性,有興趣的可以驗證一下匿名類是否可以在c++被允許。