作者winest (winest)
看板C_and_CPP
標題[問題] virtual & copy contructor
時間Fri Oct 8 10:08:37 2010
請問一下版上大大們
假設我現在有兩個class
class Base
{
public :
virtual void say() { cout << "Base" << endl; }
};
class Derive : public Base
{
public :
virtual void say() { cout << "Derive" << endl; }
};
原則上,Base和Derive會各自有一個vTable,其中的vTable->say再指向各
自的say() method,所以可以想成
struct Base
{
Base_vTable * vTable;
}
Base::Base
{
this.vTable->say = Base::say;
}
struct Derive
{
Base_vTable * vTable;
}
Derive
{
Base::Base();
this.vTable->say = Derive::say;
}
這樣才能達到polymorphism,用Base class去呼叫Derive class的實作
問題來了,當我測試下面這行程式碼時
void test( Base b )
{
b.say();
}
int main( int argc , char ** argv )
{
Base * ptr = (Base *)new Derive();
test( *ptr );
}
為什麼是跑出Base???
理論上copy constructor應該會直接b.vTable = (*ptr).vTable才對
所以這時候的b.say()會變成使用Derive的vTable而印出Derive
還是說compiler會對參數的型態做檢查然後改指針位置嗎??
謝謝各位耐心看完
--
復向東,見一商港,然商販皆金髮碧眼,料是海外來朝之英吉利商販集散所在,
舶來異寶眾多,正目眩神迷間,琴聲價響,佇聽之,或如山壑雅秀,或如水潭靜謐,
時悠遠輕揚,復而厚實凝重,令人神馳,急尋琴聲來處,見一英吉利女子正自奏藝販琴,
當下文思泉湧,兼有結識之意,於是突出人群,吟詩唱和:"商娥扶碧曲,秀謐悠而厚..."
詩未竟,曲驟斷,但見英女神色驚訝,連聲曰諾,正暗喜間,卻見數名英商巡官怒目而來
倒拖吾身,飽以老拳。嗟乎,奈何蠻夷終究不識詩詞曲賦之美...。 《文學之美》
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.53.26
→ TeaEEE:你把void test( Base b )改成void test( Base* b ) 10/08 10:13
推 nowar100:polymorphism要在pointer或reference才有效 10/08 10:14
→ winest:可是這樣compiler是怎麼處理的,我知道如果用pointer的方式 10/08 10:23
→ winest:去指的話的確是b->vTable->say()會印出Derive這是正常的, 10/08 10:23
→ winest:但現在用call by value的方式,應該是整個Derive物件傳過去 10/08 10:24
→ winest:,說錯,複製一份過去,然後再依Base的copy contructor去把 10/08 10:24
→ winest:複製的那份的vTable給b.vTable,所以應該還是Derive才對吧 10/08 10:25
推 littleshan:vtable 不會像一般成員那樣被複製 10/08 11:34
→ littleshan:不然你用Base去呼叫Derive::say的話 10/08 11:35
→ littleshan:又要如何去存取 Derive 的成員? 10/08 11:35
推 loveme00835:靜態型別 vs 動態型別 10/08 13:06