[解決済み] c++のオーバーロードされた仮想関数はclangで警告されますか?
2023-06-03 17:56:17
質問
以下のコードをコンパイルする際、clangは警告を発します。
struct Base
{
virtual void * get(char* e);
// virtual void * get(char* e, int index);
};
struct Derived: public Base {
virtual void * get(char* e, int index);
};
警告は
warning: 'Derived::get' hides overloaded virtual function [-Woverloaded-virtual]
(のようになります(もちろん、当該警告は有効にする必要があります)。
なぜなのか理解できません。Baseで同じ宣言をアンコメントすると、警告が停止することに注意してください。私の理解は、2つのget()関数が異なるシグネチャを持つので、隠蔽はありえないということです。
clang は正しいですか?なぜですか?
これはMacOS X上で、Xcodeの最近のバージョンを実行していることに注意してください。
clang --version
Apple LLVM version 5.0 (clang-500.1.74) (based on LLVM 3.3svn)
更新:Xcode 4.6.3でも同じ挙動です。
どのように解決するのですか?
この警告は、オーバーライドが意図されているときに、誤ってオーバーロードを隠してしまうことを防ぐためにあります。少し異なる例を考えてみましょう。
struct chart; // let's pretend this exists
struct Base
{
virtual void* get(char* e);
};
struct Derived: public Base {
virtual void* get(chart* e); // typo, we wanted to override the same function
};
警告である以上、必ずしも間違いであるとは言えませんが、間違いを示している可能性はあります。通常、このような警告には、より明確に、あなたが書いたものを意図していたことをコンパイラに知らせることで、それを遮断する手段があります。この場合、次のようにすればいいと思います。
struct Derived: public Base {
using Base::get; // tell the compiler we want both the get from Base and ours
virtual void * get(char* e, int index);
};
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み】バーチャル/ピュアバーチャルの説明
-
[解決済み】派生クラスでオーバーライドされた関数が、ベースクラスの他のオーバーロードを隠してしまうのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む