避免遮掩繼承而來的名稱

2021-07-14 09:41:25 字數 842 閱讀 9126

我們知道,當位於乙個derived class成員函式內指涉(refer to)base class內的某物(也許是個成員函式、typedef、或是成員變數)時,編譯器可以找出我們所指的東西,因為derived class繼承了宣告與base class內的所有東西。但是讓我們看下面一段**: //

#include "stdafx.h"

class base

;class derived : public base

;int main()

這段**帶來的行為會讓每一位第一次面對它的c++程式設計師大吃一驚。以作用域為基礎的「名稱遮掩規則」並沒有改變,因此base class內所有名為mf1和mf3的函式都被derived class內的mf1和mf3函式遮掩掉了。從名稱查詢觀點來看,base::mf1和base::mf3不再被derived class繼承。。

正如你所見,即使base class和derived class內的函式有不同的引數型別也適用,而且不論函式是virtual或non-virtual一體使用。

這些行為背後的基本理由是為了防止你在程式庫或應用框架內建立新的derived class時附帶地從疏遠的base class繼承過載函式。 

但是你通常會想繼承過載函式。實際上如果你正在使用public繼承而又不繼承那些過載函式,就違反了base和derived之間的is-a關係,不過幸運的是,你可以使用using宣告式達成目標。 //

#include "stdafx.h"

class base

;class derived : public base

;int main()

現在你就可以用derived類的物件來呼叫base類裡面的過載函式了。

避免遮掩繼承而來的名稱

public virtual void mf1 0 virtual void mf1 int virtual void mf2 void mf3 void mf3 double class derived public base derived d int x d.mf1 fine,calls de...

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

問題 base class 中的所有名為 mf1 和 mf3 的函式被 derived class 中的名為 mf1 和 mf3 的函式覆蓋。從名字搜尋的觀點看,base mf1 和 base mf3 不再被 derived 繼承!就像你看到的,即使 base 和 derived classes 中...

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

結論1 derived classes內的名稱會遮掩base classes內的名稱。在public繼承下從來沒有人希望如此。c 的名稱遮掩規則所做的唯一事情就是 遮掩名稱,至於名稱是否應為相同或不同的型別,並不重要。public繼承暗示base class 和 derived class之間是is...