WEB开发网
开发学院软件开发VC ATL布幔之下的秘密 阅读

ATL布幔之下的秘密

 2006-07-22 22:55:08 来源:WEB开发网   
核心提示: 那么,当派生类也有虚函数表指针的时候会发生什么事情呢?让我们看看下面的程序来弄懂关于带有虚函数的多重继承的概念吧,ATL布幔之下的秘密(9),程序15. #include <iostream>using namespace std;class Base1 {virtual vo

那么,当派生类也有虚函数表指针的时候会发生什么事情呢?让我们看看下面的程序来弄懂关于带有虚函数的多重继承的概念吧。

程序15. #include <iostream>
using namespace std;
class Base1 {
 virtual void f() { cout << "Base1::f" << endl; }
 virtual void g() { cout << "Base1::g" << endl; }
};
class Base2 {
 virtual void f() { cout << "Base2::f" << endl; }
 virtual void g() { cout << "Base2::g" << endl; }
};
class Base3 {
 virtual void f() { cout << "Base3::f" << endl; }
 virtual void g() { cout << "Base3::g" << endl; }
};
class Drive : public Base1, public Base2, public Base3 {
public:
 virtual void fd() { cout << "Drive::fd" << endl; }
 virtual void gd() { cout << "Drive::gd" << endl; }
};
typedef void(*Fun)(void);
int main() {
 Drive objDrive;
 Fun pFun = NULL;
 // 调用Base1的第一个虚函数
 pFun = (Fun)*((int*)*(int*)((int*)&objDrive+0)+0);
 pFun();
 // 调用Base1的第二个虚函数
 pFun = (Fun)*((int*)*(int*)((int*)&objDrive+0)+1);
 pFun();
 // 调用Base2的第一个虚函数
 pFun = (Fun)*((int*)*(int*)((int*)&objDrive+1)+0);
 pFun();
 // 调用Base2的第二个虚函数
 pFun = (Fun)*((int*)*(int*)((int*)&objDrive+1)+1);
 pFun();
 // 调用Base3的第一个虚函数
 pFun = (Fun)*((int*)*(int*)((int*)&objDrive+2)+0);
 pFun();
 // 调用Base3的第二个虚函数
 pFun = (Fun)*((int*)*(int*)((int*)&objDrive+2)+1);
 pFun();
 // 调用派生类的第一个虚函数
 pFun = (Fun)*((int*)*(int*)((int*)&objDrive+0)+2);
 pFun();
 // 调用派生类的第二个虚函数
 pFun = (Fun)*((int*)*(int*)((int*)&objDrive+0)+3);
 pFun();
 return 0;
}
程序的输出为:Base1::f
Base1::g
Base2::f
Base2::f
Base3::f
Base3::f
Drive::fd
Drive::gd

上一页  4 5 6 7 8 9 10  下一页

Tags:ATL 之下 秘密

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接