close

class A {

    A( ) { init() }

   ~A( ) {bye()}

    virutal void init() {}

    virtual void bye() {}

}

class B : A {

    B( ) : A( ) {}

    ~B() {}

    virtual void init() {}

    virutal void bye() {} 

}

int main()

{

    A *b = new B() ; // A::init() or B::init() is invoked ?

    delete b ;  // A::bye() or B::bye() is invoked ? 

}

先看比較簡單的delete b好了

答案是B::bye()被呼叫到,因為b的實體是指到class B, 所以呼叫B::bye()很正常。

那麼new B()的時候呢?

照delete的邏輯,應該會呼叫B::init()

然而答案卻是A::init()

一開始想不通,後來想通後覺得還蠻合理,甚至不這麼做會有問題。

這樣講好了,假設呼叫的是B::init()會發生甚麼事?

首先B::init()是在base ctor被呼叫到, 但此時B的member variable還沒被初始化過

所以發生的行為會不可預期

(執行順序: base class ctor ==> initialization list初始化member variable ==> derived class ctor)

但有時候的確是需要呼叫的是B::init(), 所以在BCB裡提供一個名為AfterConstruction的virtual function

寫在裡面的code會在derived class的ctor做完後執行

前提是該class必須繼承TObject才有此功能

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 elefant 的頭像
    elefant

    Aal izz well

    elefant 發表在 痞客邦 留言(0) 人氣()