多態,從希臘語言的理念而來, c++支持單繼承的同時同樣支持多繼承。而Java僅保留了單繼承,多繼承由接口實現。 virtual這一關鍵字,體現一種公享,避免了信息的冗餘。而且,體現一種c++面向對象的一種機制。 從理論到底層實現,雖然有不安全的體現。 #include"sts.h" #if(0) #endif #if(0) class B { virtual void vfun(int i = 10); }; class D : public B { virtual void vfun(int i = 20); }; int main() { // D* pD = new D(); // B* pB = pD; // pD->vfun(); // pB->vfun(); return 0; } #endif #if(0) class B { public: void DoSomething(); virtual void vfun(); }; class C : public B { public: void DoSomething();//首先說明一下,這個子類重新定義了父類的no-virtual函數,這是一個不好的設計,會導致名稱遮掩;這裏只是爲了說明動態綁定和靜態綁定才這樣使用。 virtual void vfun(); }; class D : public B { public: void DoSomething(); virtual void vfun(); }; int main() { //D* pD = new D(); //B* pB = pD; return 0; } #endif #if(0) class B { public:void show(){cout<<"B"<<endl;} }; class C : public B { public:void show(){cout<<"C"<<endl;} }; class D : public B { public:void show(){cout<<"D"<<endl;} }; int main() { D* pD = new D();//pD的靜態類型是它聲明的類型D*,動態類型也是D* B* pB = pD;//pB的靜態類型是它聲明的類型B*,動態類型是pB所指向的對象pD的類型D* C* pC = new C(); pB = pC;//pB的動態類型是可以更改的,現在它的動態類型是C* pB->show(); pC->show(); pD->show(); return 0; } #endif #if(1) #include<stdio.h> #include<iostream> #include<queue> using namespace std; class A { public: A(){printf(" create A.\n");} int a; virtual void fun1(){} }; class B:virtual public A{ public: B(){printf(" create B.\n");} int b; virtual void fun2(){} }; class C:virtual public A { public : int c; C(){printf("create C .\n");} virtual void fun3(){printf("fun3 .\n");} }; class D:public C,public B { public: int d; D(){printf("create D .\n");} virtual void fun3(){printf("fun4 .\n");} }; //二義性問題的開銷 int main() { D *pd=new D; pd->B::a=1; pd->C::a=2; printf("%d\n",pd->B::a); printf("%d\n",pd->C::a); printf("%d\n",sizeof(D)); //getchar(); } #endif #if(0) #include<stdio.h> #include<iostream> #include<queue> using namespace std; class A { public: A(){printf("A create.\n");} int a; virtual void fun(){} }; class B: public A{ public: B(){printf("B create.\n");} int b; virtual void fun1(){} }; class C: public A { public : int c; C(){printf("C create.\n");} virtual void fun3(){printf("fun3 .\n");} }; class D:public C,public B{ public: int d; D(){printf("D create.\n");} virtual void fun3(){printf("fun4 .\n");} }; //二義性問題的開銷 int main() { D *pd=new D; printf("%d\n",sizeof(D)); //getchar(); } #endif
一點整理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.