多态,从希腊语言的理念而来,
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