1. 程式人生 > >Effective C++之繼承與面向物件設計

Effective C++之繼承與面向物件設計

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 翻譯 候捷