Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Akcja którą konstruktor wykona tylko dla klasy bazowej

Ostatnio zmodyfikowano 2015-08-28 16:59
Autor Wiadomość
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:
C/C++
#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
P-136986
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
C/C++
class Bazowa {
   
    Bazowa( bool baza )
    {
        if( baza == true )
        {
            //tu robimy coś tylko dla klasy bazowej
        }
        ...
    }
    ...
};

class Potomna {
   
    Potomna()
    {
        //Jawne wywołanie konstruktora bazowego
        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

P-136992
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:
C/C++
#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 ?
P-136995
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 :)
P-137004
« 1 »
  Strona 1 z 1