ATL布幔之下的秘密(2)
2006-07-22 22:55:03 来源:WEB开发网核心提示:介绍在本系列的教程中,我要讨论一些ATL的内部工作方式以及它所使用的技术,ATL布幔之下的秘密(2),这是本系列的第二篇文章,现在让我们来探究一些虚函数背后更加有趣的资料,我将会把这些构造函数之中的指针值打印出来,为了简便起见,为了和上文保持一致,在本文的讨论中我将使用相同的顺序
介绍
在本系列的教程中,我要讨论一些ATL的内部工作方式以及它所使用的技术,这是本系列的第二篇文章。
现在让我们来探究一些虚函数背后更加有趣的资料。为了和上文保持一致,在本文的讨论中我将使用相同的顺序,程序的序号从20开始。
让我们看看下面这个程序:
程序20.
#include <iostream>
using namespace std;
class Base {
public:
virtual void fun() {
cout << "Base::fun" << endl;
}
void show() {
fun();
}
};
class Drive : public Base {
public:
virtual void fun() {
cout << "Drive::fun" << endl;
}
};
int main() {
Drive d;
d.show();
return 0;
}
程序的输出为:Drive::fun
这个程序清楚地示范了基类的函数是如何调用派生类的虚函数的。这一技术被用于不同的框架中,例如MFC和设计模式(比如Template Design Pattern)。现在你可以修改一下这个程序来看看它的行为,我将要在基类的构造函数中调用虚函数,而不是普通的成员函数。程序21.
#include <iostream>
程序的输出为:
using namespace std;
class Base {
public:
Base() {
fun();
}
virtual void fun() {
cout << "Base::fun" << endl;
}
};
class Drive : public Base {
public:
virtual void fun() {
cout << "Drive::fun" << endl;
}
};
int main() {
Drive d;
return 0;
}ase::fun
这个程序表明,我们不能在基类的构造函数中调用派生类的虚函数。好了,那就让我们来看看着布幔之下到底做了什么。我将会把这些构造函数之中的指针值打印出来,为了简便起见,我移除了类中其它的函数。
更多精彩
赞助商链接