前幾天發現一個很有趣的問題
至今仍然找不到解答
歡迎高手們來挑戰
class TestA
{
publlic:
virtual void Foo(int i){printf("TestA::Foo %d\n", i);}
virtual void Foo(char *s){printf("TestA::Foo %s\n", s);}
};
class TestB : public TestA
{
publlic:
virtual void Foo(int i){printf("TestB::Foo %d\n", i);}
};
int main()
{
TestA a;
TestB b;
a.Foo(1);
a.Foo("Call A");
b.Foo(2);
b.Foo("Call B");
}
執行以上的程式碼之後,會有何種結果?
A: 可以正常執行,但是compile過程中會有warning出現
B: complie過程沒有問題,但是執行時會當掉
C: compile根本不會過,你耍我啊?
想知道結果的人請自行測試
我只想知道原因啊!!!
文章標籤
全站熱搜

哈哈 我不是高手 但是 我還是來解答一下 最後的結果是 LEO你他媽雜碎 耍我呀 原因在 C++ Primer 裡面有寫 在第13章的地方有提到 如果基礎類別宣告是多載的 則在衍生類別必須全部重新定義基礎類別 所以 如果要用的話 就要重新定義一次 才會過 以上
既然你都說不是高手了 讓我來補充一下 事實上假如TestB沒有覆寫任何一個Foo function 原本的程式碼是可以正常執行的 但只要TestB覆寫過其中一個 嘿嘿,那就得全部都覆寫了 神奇吧~
據我所知 繼承關係發生時,Derived class跟base class之間的同名函式會產生遮蔽的效應 也就是說derived class的函式會遮蔽base class的同名函式, 之所以會有遮蔽效應是為了達成override的效果 再加上"derived class 跟base class之間不會發生overload的效應" 所以在這個case下,TestB.Foo將遮蔽TestA中的所有Foo函式 因此compiler才會找不到TestA::Foo(char*) 要解決的這個error有兩個方法 1. 在TestB中override所有的Foo函式 2. 在TestB中將TestA的Foo函式揭露出來 以此例為例: class TestB : public TestA { publlic: using TestA::Foo; virtual void Foo(int i){printf("TestB::Foo %d\n", i);} };