/*
**test28.cpp : Defines the entry point for the console application.
**系統(tǒng)winXP SP3 32位.
**類訪問的動(dòng)態(tài)綁定
*/
#include "stdafx.h"
#include "iostream.h"
class A{
public:
virtual void f(){
cout<<"A::fA1()"<<endl;
};
};
class B:public A{
public:
void f(){
cout<<"B::fB1()"<<endl;
};
};
class C:public B{
public:
void f(){
cout<<"C::fC1()"<<endl;
};
};
class D{
public:
virtual ~ D(){}
virtual void output(){};
};
class E:public D{
public:
E():eNum(0){}
virtual ~E(){}
virtual void output(int){
cout<<"E::fE1(int)"<<endl;
}
virtual void output(){
cout<<"E::fE1()"<<endl;
}
private:
int eNum;
};
int main(int argc, char* argv[])
{
A* pa = NULL;
A a;
B b;
C c;
a.f(); //fA1()
b.f(); //fB1()
c.f(); //fC1()
pa = &a;
pa->f(); //fA1()
pa = &b;
pa->f(); //fB1(),程序會(huì)根據(jù)動(dòng)態(tài)綁定來確定具體調(diào)用的函數(shù)也祠,若上面的父類A中函數(shù)不為virtual型类溢,則此處調(diào)用的是fA1()
int iNum = 0;
D d;
D* pd= &d;
//pd->output(iNum); //錯(cuò)誤
pd->output(); //空白輸出
E* pe = new E;
pe->output(); //E::fE1()
pe->output(iNum); //E::fE1(int)
return 0;
}
Tips1:派生類的函數(shù)或成員變量會(huì)遮蔽掉父類中的同名函數(shù)或成員變量。