警告 C26434
函式 'derived::function' 會隱藏非虛擬函式 'base::function' (c.128)。
C++ Core Guidelines
備註
當您在基類中引進名稱與非虛擬函式相同的函式時,可能會發生非預期的行為。 就像引進與外部範圍名稱衝突的變數名稱一樣。 例如,您可能想要覆寫基類函式。 如果函式的簽章不相符,您預期的覆寫可能會改為變成多載。 一般而言,名稱隱藏很危險且容易出錯。
在核心指導方針中會檢查:
- 只會檢查目前類別中的非覆寫函式。
- 只會考慮基類的非虛擬函式。
- 不會執行簽章比對。 如果不符合資格的名稱相符,則會發出警告。
範例
此範例示範衍生類別如何隱藏非虛擬函式,以及虛擬函式如何同時允許多載和覆寫:
// C26434.cpp
struct Base
{
virtual ~Base() = default;
virtual void is_virtual() noexcept {}
void not_virtual() noexcept {}
};
struct Derived : Base
{
void is_virtual() noexcept override {} // Okay, override existing function
virtual void is_virtual(int i) noexcept {} // Add a virtual overload for function
void not_virtual() noexcept {} // C26434, hides a non-virtual function
virtual void not_virtual(int i) noexcept {} // C26434, and parameters ignored
};