為什么重載在繼承類中不工作?
這個問題(非常常見)往往出現于這樣的例子中:
#include<iostream>
using namespace std;
class B {
public:
int f(int i) { cout << "f(int): "; return i+1; }
// ...
};
class D : public B {
public:
double f(double d) { cout << "f(double): "; return d+1.3; }
// ...
};
int main()
{
D* pd = new D;
cout << pd->f(2) << ’\n’;
cout << pd->f(2.3) << ’\n’;
}
它輸出的結果是:
f(double): 3.3
f(double): 3.6
而不是象有些人猜想的那樣:
f(int): 3
f(double): 3.6
換句話說,在B和D之間并沒有發生重載的解析。編譯器在D的區域內尋找,找到了一個函數double f(double),并執行了它。它永遠不會涉及(被封裝的)B的區域。在C++中,沒有跨越區域的重載——對于這條規則,繼承類也不例外。更多的細節,參見《C++語言的設計和演變》和《C++程序設計語言》。
文章來源于領測軟件測試網 http://www.kjueaiud.com/