多态,从希腊语言的理念而来,
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原文:http://sts609.blog.51cto.com/11227442/1758676