Effective C++之繼承與面向物件設計
阿新 • • 發佈:2018-12-28
5.條款之避免繼承而來的名稱
int x;
void someFunc()
{
double x;
std::cin >> x;
}
我們都知道上面這段程式碼會因為區域性變數的原因,輸入的x是double型別的
根據以上程式碼,我們來看看下面的類:
#include <iostream> using namespace std; class Base{ private: int x; public: virtual void mf1(int) { cout<<"Base mf1"<<endl; } }; class Derived:public Base{ public: virtual void mf1() { cout<<"Derived mf1"<<endl; } }; int main() { Derived d; int x; d.mf1(); //沒問題,呼叫Derived::mf1 //d.mf1(x); return 0; }
結果:
結果如我們所想,呼叫的是Derived類的mf1
注意:當我們把註釋掉的d.mf1(x)釋放掉,就會報錯,它不會呼叫到Base裡面的mf1函式,原因就是“繼承而來的名稱”的預設遮掩行為。
而我們肯定想的是我們要用到Base裡面的mf1函式,該如何實現
貼上以下程式碼:
#include <iostream> using namespace std; class Base{ private: int x; public: virtual void mf1(int) { cout<<"Base mf1"<<endl; } }; class Derived:public Base{ public: using Base::mf1; virtual void mf1() { cout<<"Derived mf1"<<endl; } }; int main() { Derived d; int x; d.mf1(); //沒問題,呼叫Derived::mf1 d.mf1(x); return 0; }
結果如下:
使用using宣告,讓我們繼承相同的名稱函式不會被遮掩住。
參考文獻《Effective C++》作者 Scott Meyers 翻譯 候捷