Akcja którą konstruktor wykona tylko dla klasy bazowej
Ostatnio zmodyfikowano 2015-08-28 16:59
RazzorFlame Temat założony przez niniejszego użytkownika |
Akcja którą konstruktor wykona tylko dla klasy bazowej » 2015-08-28 13:50:14 Witam, chciałbym się dowiedzieć dlaczego w tym kodzie: #include <iostream> using namespace std;
class Base { private: void base_foo() { cout << "base foo" << endl; } protected: void base_bar() { cout << "base bar" << endl; } public: Base() { if( string( typeid( * self ).name() ) == string( "4Base" ) ) base_foo(); base_bar(); } }; class Derived : public Base { public: Derived() : Base() { cout << "Derived created" << endl; } };
int main() { Derived derived; return 0; }
wykonuje się też base_foo, w końcu jest ona prywatna i sprawdzam klase a mi zależy żeby konstruktor klasy bazowej mógł wykonać coś co tylko ona wykona a jej potomkowie już nie. Wykonanie: http://ideone.com/0DG2xB |
|
darko202 |
» 2015-08-28 14:29:27 Ot trudna sprawa, bo konstruktor klasy potomnej wywołuje najpierw konstruktor klasy bazowej. Trzeba więc w konstruktorze klasy bazowej umieścić warunek, który rozpozna ta sytuację i odpowiednio się zachowa. może cos takiego class Bazowa { Bazowa( bool baza ) { if( baza == true ) { } ... } ... };
class Potomna { Potomna() { Bazowa( false ); } .... };
czyli w pochodnej realizujemy jawne wywołanie klasy bazowej z odpowiednim parametrem lub sprawdzamy w bazowej jakiej klasy obiekt jest tworzony - niestety nie znam tego rozwiązania |
|
michal11 |
» 2015-08-28 14:44:10 Prawdopodobnie nie ma wbudowanego takiego mechanizmu i trzeba próbować to obejść chyba będzie najwygodniej tak jak pokazał darko202 z drobnymi modyfikacjami: #include <iostream> using namespace std;
class Base { private: void base_foo() { cout << "base foo" << endl; } protected: void base_bar() { cout << "base bar" << endl; } public: Base( bool onlyBase = false ) { if( onlyBase ) base_foo(); base_bar(); } }; class Derived : public Base { public: Derived() { cout << "Derived created" << endl; } };
int main() { Derived derived; return 0; }
Minus takiego rozwiązania jest taki, że klasy bazowe trzeba jawnie tworzyć z tym boolem. Swoją droga to po co ci takie cuda ? |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2015-08-28 16:59:06 Rozwiązanie troche niewygodne. Nie ważne w sumie - innym sposobem to osiągnę. Chciałem zrobić to żeby nie wywoływać dodawania obiektu do rejestru 2x (w klasie bazowej i w pochodnej) ale dodam odpowiednie zabezpieczenie i będzie cacy :) |
|
« 1 » |