Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Pomógł: 'mceier'
Inne artykuły

Zmiana kolejności wywołania konstruktorów i destruktorów

[artykuł] Artykuł pokazuje jak zmienić kolejność wywołania konstruktorów i destruktorów.
Niniejszy artykuł pokazuje jak sprawić by konstruktor klasy dziedziczonej wywoływał się po utworzeniu obiektów klasy potomnej.

Kod przed zmianami

C/C++
#include <cstdio>
#include <string>

class CTalk
{
    std::string m_x;
public:
    CTalk( const char * x )
        : m_x( x )
    { printf( "CTalk(%s)\n", m_x.c_str() ); }
    ~CTalk() { printf( "~CTalk(\"%s\")\n", m_x.c_str() ); }
};

class CTest
    : public CTalk
{
    CTalk t1;
    CTalk t2;
public:
    CTest()
        : CTalk( "inherited" )
        , t1( "t1" )
        , t2( "t2" )
    { };
};

int main() {
    CTest test;
    return 0;
}
Standardowe wyjście programu:
CTalk(inherited)
CTalk(t1)
CTalk(t2)
~CTalk("t2")
~CTalk("t1")
~CTalk("inherited")

Kod po zmianach

C/C++
#include <cstdio>
#include <string>

class CTalk
{
    std::string m_x;
public:
    CTalk( const char * x )
        : m_x( x )
    { printf( "CTalk(%s)\n", m_x.c_str() ); }
    ~CTalk() { printf( "~CTalk(\"%s\")\n", m_x.c_str() ); }
};

struct CT12 {
    CT12( const char * t1s, const char * t2s )
        : t1( t1s )
        , t2( t2s )
    { }
    CTalk t1;
    CTalk t2;
};

class CTest
    : private CT12
    , public CTalk
{
public:
    CTest()
        : CT12( "t1", "t2" )
        , CTalk( "inherited" )
    { };
};

int main() {
    CTest test;
    return 0;
}
Standardowe wyjście programu:
CTalk(t1)
CTalk(t2)
CTalk(inherited)
~CTalk("inherited")
~CTalk("t2")
~CTalk("t1")