c++virtual的动态调用验证

来源:互联网 发布:金鼎娱乐源码下载 编辑:程序博客网 时间:2024/06/07 09:51

来看一个例子

#include <iostream>#include <string>using namespace std;class Base {public:    void func1(string prefix);    void func2(string prefix);    void func3(string prefix);};void Base::func1(string prefix) {    cout << prefix << "A::func1" << endl;};void Base::func2(string prefix) {    cout << prefix << "A::func2" << endl;    func1(prefix + "  ");}void Base::func3(string prefix) {    cout << prefix << "A::func3" << endl;}class Derived: public Base {public:    void func1(string prefix);    void func3(string prefix);};void Derived::func1(string prefix) {    cout << prefix << "B::func1" << endl;}void Derived::func3(string prefix) {    cout << prefix << "B::func3" << endl;    Base::func3(prefix + "  ");    func1(prefix + "  ");    func2(prefix + "  ");}

测试用例:

Derived test;test.func3("");

打印结果:

B::func3  A::func3  B::func1  A::func2    A::func1

结论:可以看出,没有加virtual的函数,在编译期已经确定了函数的地址。

如果在Base类的func1定义中加上virtual,改成 virtual void func1(string prefix);

打印结果会是:

B::func3  A::func3  B::func1  A::func2    B::func1

结论:有virtual的函数,会在运行期动态寻找函数。

文章参考:http://www.cnblogs.com/waytofall/archive/2012/07/09/2583645.html

原创粉丝点击