簡體   English   中英

用相同的參數調用基類的C ++構造函數

[英]Call C++ constructor of base class with same arguments

我有這樣的事情:

class A {
public:
  A(int a1,int a2,int a3) {
  }
}
class B: public A {
public:
  B(int a1,int a2,int a3) : A(a1,a2,a3) { 
     .. Do Some More Init for B ...
  }
}

是否可以用較短的形式編寫構造函數? 基類的構造函數應使用相同的參數調用。 但是我不想明確列出所有參數。 我需要為B類做一些特殊的初始化工作。

我認為是這樣的:

class B: public A {
public:
  B(int a1,int a2,int a3) : A(...AUTOARG...) { 
    .. Do Some More Init for B ...
  }
}

在C ++ / 11中可能嗎?

如果B的構造函數內沒有代碼發生,並且您只想以A可以構造的相同方式允許其構造,則可以繼承 A的構造函數:

class B: public A {
public:
  using A::A;
};

這將為B提供與A相同的所有構造函數。

如所編輯的問題所述,如果B的構造函數不為空,則仍可以使用具有完美轉發功能的“包羅萬象”構造函數以通用(但效果不佳)的方式獲得“全部完成A功能,再加上更多的功能” :

class B: public A {
public:
  template <class... Arg>
  B(Arg&&... arg) : A(std::forward<Arg>(arg)...) { 
     //.. Do Some More Init for B ...
  }
}

請注意,就類型特征而言,這會稍微改變B的行為。 現在看來可以用任何東西構造,但是使用不正確的參數將無法編譯。 如果您還需要該類在可構造性檢測特性等方面發揮出色的作用 ,則可以使用SFINAE有條件地禁用不正確的實例化。

更好的是, 繼承構造函數。 這是C ++ 11的新功能:

class B: public A {
public:
  using A::A;
};

但是,不幸的是,如果您希望B構造函數執行其他操作,那么您將需要像現在這樣將其寫出來。

暫無
暫無

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

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