Wenn Sie einfach nur alle Konstruktorargumente an die Basisklasse übergeben (=Eltern), hier ein minimales Beispiel.
Dabei werden Vorlagen verwendet, um jeden Konstruktoraufruf mit 1, 2 oder 3 Argumenten an die übergeordnete Klasse weiterzuleiten std::string
.
Code
Live-Version
#include <iostream>
#include <string>
class ChildString: public std::string
{
public:
template<typename... Args>
ChildString(Args... args): std::string(args...)
{
std::cout
<< "\tConstructor call ChildString(nArgs="
<< sizeof...(Args) << "): " << *this
<< std::endl;
}
};
int main()
{
std::cout << "Check out:" << std::endl;
std::cout << "\thttp://www.cplusplus.com/reference/string/string/string/" << std::endl;
std::cout << "for available string constructors" << std::endl;
std::cout << std::endl;
std::cout << "Initialization:" << std::endl;
ChildString cs1 ("copy (2)");
char char_arr[] = "from c-string (4)";
ChildString cs2 (char_arr);
std::string str = "substring (3)";
ChildString cs3 (str, 0, str.length());
std::cout << std::endl;
std::cout << "Usage:" << std::endl;
std::cout << "\tcs1: " << cs1 << std::endl;
std::cout << "\tcs2: " << cs2 << std::endl;
std::cout << "\tcs3: " << cs3 << std::endl;
return 0;
}
Ausgabe
Check out:
http://www.cplusplus.com/reference/string/string/string/
for available string constructors
Initialization:
Constructor call ChildString(nArgs=1): copy (2)
Constructor call ChildString(nArgs=1): from c-string (4)
Constructor call ChildString(nArgs=3): substring (3)
Usage:
cs1: copy (2)
cs2: from c-string (4)
cs3: substring (3)
Update: Variadic-Vorlagen verwenden
Zur Verallgemeinerung auf n Argumente und zur Vereinfachung
template <class C>
ChildString(C arg): std::string(arg)
{
std::cout << "\tConstructor call ChildString(C arg): " << *this << std::endl;
}
template <class C1, class C2>
ChildString(C1 arg1, C2 arg2): std::string(arg1, arg2)
{
std::cout << "\tConstructor call ChildString(C1 arg1, C2 arg2, C3 arg3): " << *this << std::endl;
}
template <class C1, class C2, class C3>
ChildString(C1 arg1, C2 arg2, C3 arg3): std::string(arg1, arg2, arg3)
{
std::cout << "\tConstructor call ChildString(C1 arg1, C2 arg2, C3 arg3): " << *this << std::endl;
}
zu
template<typename... Args>
ChildString(Args... args): std::string(args...)
{
std::cout
<< "\tConstructor call ChildString(nArgs="
<< sizeof...(Args) << "): " << *this
<< std::endl;
}
21 Stimmen
Nur eine Erbsenzählerei: In C++ gibt es keine "Superklasse", in der Norm wird sie überhaupt nicht erwähnt. Diese Formulierung stammt (höchstwahrscheinlich) aus Java. In C++ wird "Basisklasse" verwendet. Ich denke, dass super impliziert einen einzigen Elternteil, während C++ Mehrfachvererbung zulässt.
0 Stimmen
@andreee Ich redete, dass ein
super class
wird auch alsbase class
und auch z.B. im qt toolkitparent class
- in dieser Reihenfolge asub class
wird auch alschild class
Vielleicht hilft das, eine mögliche Verwirrung in der Terminologie zu bekämpfen