Re: [問題] overriding 遮蔽 overloading 的原因?
※ 引述《yoco315 (眠月)》之銘言:
: class B {
: void f () ;
: void f (int) ;
: } ;
: class D : B {
: void f (int) ;
: } ;
: main () {
: D d ;
: d.f () ; // error
: }
: error 的原因是找不到函數,
: 我想問的不是原因,我知道是被遮蔽了,
: 我想問的是:為什麼 C++ 要這樣設計?
: 為什麼當 override 一個函數的時候,
: 要遮蔽所有同名的其他版本?
: 今天同事問我,我還真想不到 @"@
: 先感謝。
爬文查資料的時候剛好看到這篇,測試後推出一點結果,大家有空看看對不對。
(編譯器只有用 Visual C++ 2008 測過)
不考慮虛擬函數的狀況(virutal)
1. 子類別有相同名稱之函數時,繼承自父類別的所有同名函數都不會被覆蓋消失。
2. 函數繼承後,命名空間以子類別為主。因此父類別所有同名函數,都一定要
用完整名稱才能正確存取,如「子物件.父類別::函數名」。
3. void f(int) 用 public宣告,且 class D : public B {}; 才不會存取錯誤。
--
原推文中版友提到可能叫重新定義,但實際用程式測試,用 d.f(1); 跟 d.B::f(1);
分別都可跑B、D類別中定義的void f(int),所以應該不算一種重新定義?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.129.19
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章
26
152