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才有此功能
留言列表