#include "iostream"
using namespace std;
// 对象的动态与静态类型
class B{
};
class C: public B{
};
class D:public B{
};
int main(){
D *pD = new D(); // pD的静态类型是它声明的类型D*,动态类型也是D*
B *pB = pD; // pB的静态类型是它声明的类型B*,动态类型是pB所指向的对象pD的类型D*
C *pC = new C(); // pC的静态类型是它声明的类型C*,动态类型也是C*
pB = pC; // pB的动态类型是可以更改的,现在它的动态类型是C*
return 0;
}
静态绑定:绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型,发生在编译期
动态绑定:绑定的是对象的动态类型,某特性(比如函数)依赖于对象的动态类型,发生在运行期
关于静态绑定和动态绑定,示例如下:
#include "iostream"
using namespace std;
class B{
public:
void DoSomething(){
cout << "B DoSomething()......\n";
}
virtual void vfun(){
cout << "B vfun()......\n";
}
};
class C: public B{
public:
void DoSomething(){ // 首先说明一下,这个子类重新定义了父类的no-virtual函数,这是一个不好的设计,会导致名称隐藏;这里只是为了说明动态绑定和静态绑定才这样使用。
cout << "C DoSomething().....\n";
}
virtual void vfun(){
cout << "C vfun()......\n";
}
};
class D:public B{
public:
void DoSomething(){
cout << "D DoSomething().....\n";
}
virtual void vfun(){
cout << "D vfun()......\n";
}
};
int main(){
// 静态绑定
D *pD = new D();
B *pB = pD;
pD->DoSomething();
pB->DoSomething();
// 动态绑定
pD->vfun();
pB->vfun();
return 0;
}