天天看點

筆記:條款33: 避免遮掩繼承而來的名稱

這是我在閱讀Effective c++中認為比較重要的部分,下面給出了我對這一節的了解,并寫出對應的比較容易了解的代碼。

當發生繼承時,如下所示,子類的mf1會遮擋父類中的mf1()和mf1(int), 編譯器預設的行為是不允許父類中的重載函數派生到子類中,如果想在子類中使用父類中的重載函數,那麼要在子類中使用using,本例中就是using A::mf1;

class A {
public:
	virtual void mf1() = 0;
	virtual void mf1(int) {
		cout << "A mf1" << endl;
	}
};
class B: public A {
public:
	void mf1() {
		cout << "B mf1" << endl;
	}
};

int main() {
	B b;
	b.mf1();
}
           

如果我們隻想使用基類中的mf1(),那麼using聲明式在這裡派不上用場,因為using聲明式會令繼承而來的某給定名稱的所有同命函數都在派生類中可見,解決方法是提供一個轉交函數。如下B類中的mf1就是轉交函數。

class A {
public:
	virtual void mf1() = 0;
	virtual void mf1(int) {
		cout << "A mf1" << endl;
	}
};
class B: private A {
public:
	using A::mf1;
	void mf1() {
		A::mf1(1);
	}
};
int main() {
	B b;
	b.mf1();
}
           

請記住

繼承類内的名稱會遮掩基類内的名稱。

為了讓被遮掩的名稱再見天日,可使用using聲明式或轉交函數。

繼續閱讀