1. 程式人生 > >c++virtual的動態呼叫驗證

c++virtual的動態呼叫驗證

來看一個例子

#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的函式,會在執行期動態尋找函式。