[解決済み] インライン仮想関数は本当に無意味なのか?
2022-04-15 08:15:26
質問
コードレビューで仮想関数はインラインである必要はないというコメントをもらったときに、この質問を受けました。
インラインの仮想関数は、オブジェクトに対して直接関数を呼び出すような場合に便利だと思いました。しかし、「なぜvirtualを定義して、オブジェクトを使ってメソッドを呼び出したいのか」という反論が頭に浮かびました。
インラインの仮想関数は、どうせほとんど拡張されないので、使わないほうがいいのでしょうか?
解析に使用したコードスニペット
class Temp
{
public:
virtual ~Temp()
{
}
virtual void myVirtualFunction() const
{
cout<<"Temp::myVirtualFunction"<<endl;
}
};
class TempDerived : public Temp
{
public:
void myVirtualFunction() const
{
cout<<"TempDerived::myVirtualFunction"<<endl;
}
};
int main(void)
{
TempDerived aDerivedObj;
//Compiler thinks it's safe to expand the virtual functions
aDerivedObj.myVirtualFunction();
//type of object Temp points to is always known;
//does compiler still expand virtual functions?
//I doubt compiler would be this much intelligent!
Temp* pTemp = &aDerivedObj;
pTemp->myVirtualFunction();
return 0;
}
解決方法は?
仮想関数はインライン化できる場合があります。優れた C++のよくある質問 :
インラインの仮想呼び出しが行われるのは をインライン化できるのは、コンパイラが オブジェクトの正確なクラスがわかっている。 のターゲットである仮想 関数を呼び出すことができます。このようなことが起こるのは コンパイラが実際のオブジェクト へのポインタや参照ではなく オブジェクトを作成します。すなわち、ローカル オブジェクト、グローバル/スタティックオブジェクト、または の中に完全に含まれるオブジェクトです。 コンポジット.quot。
関連
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++の余分な資格エラー
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】変数やフィールドがvoid宣言されている