[英]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.