看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) C++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) None 問題(Question): 通常設定虛擬函數的時候 就算是派生類還是會繼承母類原本有的成員函數 當某些子函數要使用虛擬函數的時候 如果直接傳入類的地址卻指定一定要類型定義為基類 原因是...? 餵入的資料(Input): Call(new A()); void Call( B *p ) { p->Fun(); p->Do(); } 預期的正確結果(Expected Output): 編譯通過 錯誤結果(Wrong Output): Call(new A())出現錯誤:No matching function for call to 'Call' 程式碼(Code):(請善用置底文網頁, 記得排版) class A { private: int nVal; public: void Fun() { cout << "A::Fun" << endl; } virtual void Do() { cout << "A::Do" << endl; } }; class B:public A { public: virtual void Do() { cout << "B::Do" << endl; } }; 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.245.65.181 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1441886237.A.442.html
LPH66: 這是 "IS-A" 的觀念: B "IS-A" A (B "是一個" A) 09/10 20:01
LPH66: 所以參數指定 A 我可以丟一個 B 進去 09/10 20:01
LPH66: 但 A "IS-NOT-A" B (A "不是一個" B) 09/10 20:02
LPH66: 所以參數指定 B 丟一個 A 進去當然會拒絕 09/10 20:02
那不好意思能在請問一下大大為什麼下面這段就沒有這個問題呢? class A { private: int nVal; public: void Fun() { cout << "A::Fun" << endl; } void Do() { cout << "A::Do" << endl; } }; class B:public A { public: virtual void Do() { cout << "B::Do" << endl; } }; class C:public B { public: void Do( ) { cout << "C::Do" <<endl; } void Fun() { cout << "C::Fun" << endl; } }; void Call( B &p ) { p.Fun(); p.Do(); } int main() { C c; Call(c); return 0; } ※ 編輯: dinex (60.245.65.181), 09/11/2015 14:46:24
a27417332: 瞭解繼承嗎?先查查看資料思考一下,感覺你概念不清楚 09/11 14:51
發現自己耍笨了==謝謝大家幫忙 ※ 編輯: dinex (1.160.88.39), 09/13/2015 16:48:58