c++virtual的動態呼叫驗證
阿新 • • 發佈:2019-02-19
來看一個例子
#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的函式,會在執行期動態尋找函式。