摘自:http://blog.youkuaiyun.com/RayChase/archive/2008/03/27/2223381.aspx
#include <iostream>using namespace std;
class Grandfather{
public:
virtual void display()=0;
void run(){
cout<<"Grandfather Run!!! ";
}
};
class Father:public Grandfather{
public:
int fatherValue;
void display(){
cout<<"Father Display!! ";
}
void run(){
cout<<"Father Run!!! ";
}
};
class Uncle:public Grandfather{
public:
int uncleValue;
void display(){
cout<<"Uncle Display!! ";
}
void run(){
cout<<"Uncle Run!!! ";
}
};
class Son:public Father{
public:
int sonValue;
void display(){
cout<<"Son Display!! ";
}
};
void main(){
Grandfather* grandfather_pt=NULL;
Father* father_pt=NULL;
Son* son_pt=NULL;
Father father;
Uncle uncle;
Son son;
cout<<"静态绑定 不用virtual关键字: ";
grandfather_pt=&uncle;
grandfather_pt->run();
grandfather_pt=&father;
grandfather_pt->run();
cout<<" 动态绑定 纯虚函数: ";
grandfather_pt=&uncle;
grandfather_pt->display();
grandfather_pt=&father;
grandfather_pt->display();
cout<<" 指针强制转换 ";
( (Father*)(&son) )->display();
// ( (Father*)(&son) )->run();
cout<<" 对象强制转换 ";
((Father)son).display(); //只允许upcasting,不允许downcasting
cout<<" 编译器为了防止对象切割的发生,自动调用拷贝构造函数,因此,比较地址: ";
cout<<( father_pt=&((Father)son) )<<endl; //注意优先级
cout<<&son<<endl;
cout<<"发现二者不同! ";
}