一點整理

多態,從希臘語言的理念而來,
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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章