[問題] 虛擬函數在子函數要傳入的類型
開發平台(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
→
09/10 20:01, , 1F
09/10 20:01, 1F
→
09/10 20:01, , 2F
09/10 20:01, 2F
→
09/10 20:02, , 3F
09/10 20:02, 3F
→
09/10 20:02, , 4F
09/10 20:02, 4F
那不好意思能在請問一下大大為什麼下面這段就沒有這個問題呢?
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
→
09/11 14:51, , 5F
09/11 14:51, 5F
發現自己耍笨了==謝謝大家幫忙
※ 編輯: dinex (1.160.88.39), 09/13/2015 16:48:58
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章