Cに隠れている関数とは何ですか?
Cに隠れる関数は、派生クラスがベースクラス関数と同じ名前の関数を定義し、ベースバージョンを導出されたクラスでアクセスできない場合に発生します。これは、ベース関数が仮想ではなく、署名がオーバーライドと一致しない場合に発生し、宣言を使用することは使用されません。 1.ベース関数のすべてのオーバーロードをブロックします。 2。派生クラスで名前のルックアップが停止します。 3.ベース:: func、明示的な呼び出し、または改名を使用してそれを修正します。 4.意図的にアクセスを制限しているが、しばしば意図せずに慎重に管理する必要がある場合に役立ちます。
cに隠れる関数は、派生クラスの関数が同じ関数の基本クラスバージョンが派生クラスを介してアクセス可能になるのを防ぐ場合です。これは通常、ベースクラスと派生クラスの両方で同じ名前(おそらく異なるパラメーターまたはリターンタイプ)を持つ関数がある場合に発生します。

この動作は、仮想関数にのみ適用され、ベースバージョンと派生バージョン間の接続を維持する関数のオーバーライドとは異なることに注意することが重要です。派生クラスを介してアクセスすると、機能を隠すことは、基本クラスの関数を完全に隠します。

機能の隠れはどのように起こりますか?
これらの条件下では、関数の非表示がCで発生します。
- 基本クラスの関数と同じ名前を持つ派生クラスの関数を定義します。
- ベースクラスの関数は仮想ではなく、たとえそうであっても、署名はオーバーライドと正確に一致しません。
- 派生クラスは
using BaseClass::functionName;
ベースバージョンをスコープにするため。
例えば:

クラスベース{ 公共: void show(){cout << "base show"; } }; クラス派生:パブリックベース{ 公共: void show(int x){cout << "derived show with int"; } };
さて、 Derived
オブジェクトの引数なしでshow()
を呼び出そうとすると、ベースバージョンは見つかりません。隠されています。
なぜそれが起こるのですか?
cは、 name lookup : obj.show()
のような関数を呼び出すと、 obj
のクラスを調べ始め、 show
という名前の関数が見つかるとすぐに停止します。 Derived
にshow
がある場合、 Base
をチェックすることは気になりません。
これは、パラメーターリストが異なる場合でも、派生クラスに同じ名前の関数を宣言すると、すべてのベースクラスの過負荷が非表示になります。
それを修正または回避する方法
関数の両方のバージョンへのアクセスを維持したい場合は、いくつかのオプションがあります。
派生クラスの
using
宣言を使用します。クラス派生:パブリックベース{ 公共: ベース:: show; //ベースのショーをスコープに持ち込みます void show(int x){cout << "derived show with int"; } };
現在、
obj.show()
を呼び出し、obj.show(5)
派生バージョンを呼び出します。または、基本クラスの関数を明示的に呼び出します。
派生d; d.base :: show(); //ベースのショーを呼び出します
または、非難が意図的ではない場合、紛争を回避するために関数の1つを変更してください。
- 派生したクラスを設計しており、意図的に特定の継承された機能へのアクセスを削除したいと考えています。
- 機能を完全に置き換えて、古いバージョンを誤って使用したくありません。
いつ役に立ちますか?
関数の非表示は常にバグではありません。時には意図的なものです。例えば:
しかし、ほとんどの場合、特に継承階層を操作し、多型の挙動を期待する場合は、機能の隠れに頼る代わりにvirtual
関数と適切なオーバーライドを使用する方が良いです。
したがって、関数の非表示は、基本的にcで名前解像度がどのように機能するかの副作用です。気付いていない場合はつまずくことができますが、宣言や慎重な命名をusing
と、管理できます。
以上がCに隠れている関数とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

Cのベクトル要素を見つける最も一般的な方法は、STD :: findを使用することです。 1。STD:: ITERATORの範囲とターゲット値で検索するために検索します。返されたイテレーターがend()に等しいかどうかを比較することにより、それが見つかったかどうかを判断できます。 2。カスタムタイプまたは複雑な条件の場合、std :: find_ifを使用する必要があり、述語関数またはlambda式を渡す必要があります。 3.文字列などの標準タイプを検索すると、ターゲット文字列を直接渡すことができます。 4.各検索の複雑さはO(n)であり、小規模データに適しています。頻繁に検索するには、std :: setまたはstd :: unordered_setの使用を検討する必要があります。この方法は、シンプルで効果的で、さまざまな検索シナリオに広く適用されます。

ディレクトリ簡潔な(証明)簡潔(証明)は何ですか?どのベンチャーキャピタルが簡潔(証明)をサポートしていますか? SP1ZKVMとProver Network Opsuccccinctテクノロジークロスチェーン検証を証明するトークン経済学トークンの詳細トークンアラケーション潜在的トークンホルダーは、トークンの価格予測を証明するトークンの価格予測を証明するトークンの価格の予測を証明するトークンの潜在的なトークンの予測されるトークンの価格の予測を証明します。サクサク

答えは次のとおりです。STD:: STRINGコンストラクターを使用して、CHARアレイをSTD :: Stringに変換します。配列に中間体「\ 0」が含まれている場合、長さを指定する必要があります。 1。「\ 0」で終わるcスタイルの文字列の場合、std :: stringsstr(chararray)を使用します。コンバージョンを完了するには。 2.文字配列に中央の「\ 0」が含まれているが、最初のn文字を変換する必要がある場合は、std :: stringstr(chararray、length)を使用します。長さを明確に指定します。 3.固定サイズの配列を処理するときは、「\ 0」で終了してから変換してください。 4。Str.Assign(Chararray、Chararray strlを使用します

todebugac applicationsinggdbinvisualstudiocode、configurethelaunch.jsonfilecorectly; keysettingsincludespecifiedtheexexecutable with "program"、「gdb」に「gdb」と「type」を「cppdbg」に設定し、「ex」を使用します

要素を削除するときに反復している場合は、故障したイテレーターの使用を避ける必要があります。正しい方法は、it = vec.erase(it)を使用し、earseによって返された有効なイテレーターを使用してトラバースを続けることです。 batchバッチ削除に推奨される「消去除去」イディオム:vec.erase(std :: remove_if(vec.begin()、vec.end()、条件)、vec.end())、安全で効率的です。 reverse逆イテレータを使用して背面から前面に削除できますが、ロジックは明確ですが、条件方向に注意を払う必要があります。結論:消去リターン値でイテレーターを常に更新し、障害のあるイテレーターの操作を禁止します。そうしないと、未定義の動作が生じます。

STD :: Mutexは、データ競争を防ぐために共有リソースを保護するために使用されます。この例では、STD :: lock_guardの自動ロックとロック解除を使用して、マルチスレッドの安全性を確保します。 1。STD:: MUTEXおよびSTD :: LOCK_GUARDを使用すると、ロックの手動管理によってもたらされる異常なリスクを回避できます。 2。マルチスレッドを変更する際には、カウンターなどの共有変数をMutexで保護する必要があります。 3.例外の安全性を確保するために、RAIIスタイルのロック管理をお勧めします。 4.固定順序でデッドロックと複数のロックを避けます。 5.共有リソースへのマルチスレッドアクセスのシナリオは、Mutex同期を使用する必要があり、最終プログラムは予想される10000および実際の出力を正しく出力します:10000。

theautokeywordinc deducestheTypeofavariaible fromitializer、makingcodecleanerandmoremaintable.1.特に、特にコンペルスティペステルター。2

TagDispatchingは、タイプタグを使用して、コンピレーション期間中に最適な関数過負荷を選択して、効率的な多型を実現します。 1。STD:: ITERATOR_TRAITSを使用して、Iteratorカテゴリタグを取得します。 2。複数のdo_advance過負荷関数を定義し、それぞれRandom_access_iterator_tag、bidrectional_iterator_tag、input_iterator_tagを処理します。 3.主な関数MY_ADVANCEは、派生したタグタイプに基づいて対応するバージョンを呼び出して、コンパイル期間の決定中にランタイムオーバーヘッドがないことを確認します。 4.このテクノロジーは、STD :: Advanceなどの標準ライブラリによって採用されており、拡張カスタマイズをサポートしています。
