- http://codexpert.ro/blog/2013/08/26/inherited-constructors-in-cpp11/
- http://en.cppreference.com/w/cpp/language/using_declaration
W poniższym przykładzie klasa Derived, dziedziczy z dwóch klas bazowych, dla których zachodzi konflikt dla Base1(int) i Base2(int), powodujący błąd kompilacji. Aby się go pozbyć w klasie pochodnej należało stworzyć własną wersję tego konstruktora. Ponieważ w Derived pojawił się już konstruktor, kompilator nie wygeneruje za nas konstruktora domyślnego (linia 32 - nie działa) - można stworzyć własną wersję.
#include <iostream> #include <vector> using namespace std; struct Base1 { Base1() { cout << "Base1" << endl; } Base1(std::vector<int>) { cout << "Base1(vector)" << endl; } Base1(int) { cout << "Base1(int)" << endl; } }; struct Base2 { Base2() { cout << "Base2" << endl; } Base2(int) { cout << "Base2(int)" << endl; } }; struct Derived : public Base1, public Base2 { using Base1::Base1; using Base2::Base2; // Ta wersja konstruktora znajduje się w Base1 i Base2 // należy zdefiniować jej własną wersję! Derived(int i) : Base1(i), Base2(i) { cout << "Derived(int)" << endl; } }; struct SimpleDerived : public Base1 { using Base1::Base1; }; int main() { // Derived d1; Derived d2(789); Derived d3({1, 2}); SimpleDerived s1; SimpleDerived s2(42); SimpleDerived s3({1, 2}); return 0; }Wynik:
Base1(int) Base2(int) Derived(int) Base1(vector) Base2 Base1 Base1(int) Base1(vector)
Brak komentarzy:
Prześlij komentarz