簡體   English   中英

子類隱藏父類的構造函數

[英]child class hides parent class's constructor

我有一個繼承P類的C

template <typename T>
class P{
  public:
  P();
  P(T* sometype);
};

class C: public P<sometype>{

};

現在C隱藏P(sometype*)構造函數嗎? 但我需要在C使用P(ometype*)構造函數。 我是否需要編寫另一個調用父構造函數的C(sometype*) 或者有一些輕松的突破。 我不想使用C++11功能。

是的,構造函數不是繼承的。 你需要為C寫一個新的:

template <typename T>
class C : public P<T> {
public:
  C(T* sometype) { /*...*/ }
};

另請注意,您使用標識符sometype是不一致的。 P的情況下,您將其用作變量名稱,在C它是一個類型名稱,但是尚未聲明的名稱。

另一個問題是C的構造函數將如何處理sometype對象。 我懷疑它將完全與P的構造函數完成,並且因為無論如何你需要調用基類的構造函數,你的C構造函數的實現很可能如下所示:

template <typename T>
class C : public P<T> {
public:
  C(T* sometype):P<T>(sometype) { }
};

最后一點:C ++ 11實際上提供了構造函數繼承作為一個特性。 由於您對使用C ++ 11功能不感興趣(雖然確實很遺憾),並且由於許多編譯器尚未實現該功能,因此我不會詳細介紹。 此處是對功能定義的引用。

如果您需要通過子類型指定基類 type T ,請嘗試以下操作:

template<typename T>
class C : public P<T> {
  public:
    C(T* pT): P(pT) {}
}

int* pMyInt;
C<int> myClass(mMyInt);

您應該編寫一個C的構造函數,它接受相同的參數並將其傳遞給它的父類,如下所示:

C(T* sometype)
    : P(sometype)
{
}

現在C會隱藏P(sometype *)構造函數嗎?

是的,從某種意義上說C不會繼承P的構造函數。 所以C不會讓類的用戶可以使用父類的構造函數。

但我需要在C中使用P(ometype *)結構

這是可能的:你只需直接調用它:

P::P(sometype*)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM