多重継承によるC ++コンストラクターの過負荷解決

DFS_Shadow

オーバーロード解決が1つのコンストラクターを別のコンストラクターよりも選択する理由について、もう少し情報を取得したいこの短いコードスニペットがあります。問題のコードは次のとおりです。

#include <iostream>

struct Base
{

};

struct Other
{
    Other(const Other&)
    {
        std::cout << "Copy Constructor\n";
    }
    Other(const Base&)
    {
        std::cout << "Custom Constructor\n";
    }
};

struct Derived : public Base, public Other
{
    Derived() :
        Other(*this)
    {

    }
};

int main()
{
    Derived derived;    // Prints "Copy Constructor"

    system("pause");
    return 0;
}

C ++標準には、コピーコンストラクターをユーザー定義コンストラクターよりも適切に一致するものとして定義するセクションがあると思います*?それ以外の私の仮定は、コピーコンストラクターを優先するルールが存在しない場合、コンパイラーは継承の順序(多重継承の構築の順序と同様)に従うか、あいまいなコンストラクター呼び出しエラーを返すだけであるというものでした。しかし、ここで順序逆転Derivedから継承Baseし、Other好まれているコピーコンストラクタについての私の最初の推測が正しいと信じて私をリード出力は、変更されませんが。誰かが私が見ている行動を決定するルールを私に指摘できますか?

* cppreference.comの過負荷解決ページを確認しましたが、表示されている動作を説明するルールがリストに表示されていません(ただし、Standardeseに完全に精通しているわけではないため、簡単に見逃してしまう可能性があります)。

DFS_Shadow

問題のコードスニペットがコンパイルされる理由は、Visual Studioの非標準の準拠動作によるものです(現在、VS2017.3プレビューを使用しています。VS2017.3プレビューは、/ permit-フラグがあってもエラーなしでコードをコンパイルします)。以下は、GCCとClangによって発行されたエラーです。

GCC

Error(s):
source_file.cpp: In constructor ‘Derived::Derived()’:
source_file.cpp:25:20: error: call of overloaded ‘Other(Derived&)’ is ambiguous
         Other(*this)
                    ^
source_file.cpp:16:5: note: candidate: Other::Other(const Base&)
     Other(const Base&)
     ^
source_file.cpp:12:5: note: candidate: Other::Other(const Other&)
     Other(const Other&)
     ^

Clang

Error(s):
source_file.cpp:25:9: error: call to constructor of 'Other' is ambiguous
        Other(*this)
        ^     ~~~~~
source_file.cpp:12:5: note: candidate constructor
    Other(const Other&)
    ^
source_file.cpp:16:5: note: candidate constructor
    Other(const Base&)
    ^
1 error generated.

http://rextester.com/から取得したエラー出力

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

異なるクラスのコンストラクターの過負荷解決

分類Dev

多重継承による過負荷解決

分類Dev

過負荷の解決、テンプレート、継承

分類Dev

C ++での多重継承によるキャスト

分類Dev

Pythonでのsuper()による多重継承

分類Dev

テンプレートパラメータによる過負荷解決

分類Dev

独自のテンプレートと継承の場合の過負荷解決

分類Dev

2つのパラメーターパックによる関数テンプレートの過負荷解決

分類Dev

概念ベースのポリモーフィズムc ++による多重継承

分類Dev

C ++コンストラクター:完璧な転送と過負荷

分類Dev

デフォルト以外のコンストラクターによる多重継承のメモリ割り当て

分類Dev

複数の実行可能なタイプによるテンプレートの過負荷の解決

分類Dev

自動によるテンプレート関数の過負荷解決

分類Dev

Scala-アプリトレイトによる多重継承

分類Dev

ミックスインによるES6クラスの多重継承

分類Dev

テンプレートパラメータを追加すると、過負荷の解決によりあいまいな呼び出しが発生します

分類Dev

C ++の多重継承に関するいくつかの基本

分類Dev

過負荷解決は、テンプレートのインスタンス化ポイントの後に関数を見つけます

分類Dev

多重継承による非協力的スーパークラスの適応

分類Dev

インターフェースによる多重継承のあいまいさ

分類Dev

クラス内の友達オペレーターが過負荷解決に参加していないようです

分類Dev

非型パラメータの存在に基づくクラステンプレートの過負荷?

分類Dev

アクセス可能な「パラメータ」がこの数の引数を受け入れないため、過負荷の解決に失敗しました

分類Dev

クラスのプライベートメンバーにアクセスして過負荷を解消しようとするのは不正ですか?

分類Dev

Java のコンストラクターによる継承

分類Dev

引数が初期化子リストであり、パラメーターが参照である場合の過負荷解決

分類Dev

Kotlinの1つのクラスとインターフェースによる多重継承

分類Dev

インターフェイスの継承と過負荷

分類Dev

多重継承におけるクラスメンバーの曖昧性解消

Related 関連記事

  1. 1

    異なるクラスのコンストラクターの過負荷解決

  2. 2

    多重継承による過負荷解決

  3. 3

    過負荷の解決、テンプレート、継承

  4. 4

    C ++での多重継承によるキャスト

  5. 5

    Pythonでのsuper()による多重継承

  6. 6

    テンプレートパラメータによる過負荷解決

  7. 7

    独自のテンプレートと継承の場合の過負荷解決

  8. 8

    2つのパラメーターパックによる関数テンプレートの過負荷解決

  9. 9

    概念ベースのポリモーフィズムc ++による多重継承

  10. 10

    C ++コンストラクター:完璧な転送と過負荷

  11. 11

    デフォルト以外のコンストラクターによる多重継承のメモリ割り当て

  12. 12

    複数の実行可能なタイプによるテンプレートの過負荷の解決

  13. 13

    自動によるテンプレート関数の過負荷解決

  14. 14

    Scala-アプリトレイトによる多重継承

  15. 15

    ミックスインによるES6クラスの多重継承

  16. 16

    テンプレートパラメータを追加すると、過負荷の解決によりあいまいな呼び出しが発生します

  17. 17

    C ++の多重継承に関するいくつかの基本

  18. 18

    過負荷解決は、テンプレートのインスタンス化ポイントの後に関数を見つけます

  19. 19

    多重継承による非協力的スーパークラスの適応

  20. 20

    インターフェースによる多重継承のあいまいさ

  21. 21

    クラス内の友達オペレーターが過負荷解決に参加していないようです

  22. 22

    非型パラメータの存在に基づくクラステンプレートの過負荷?

  23. 23

    アクセス可能な「パラメータ」がこの数の引数を受け入れないため、過負荷の解決に失敗しました

  24. 24

    クラスのプライベートメンバーにアクセスして過負荷を解消しようとするのは不正ですか?

  25. 25

    Java のコンストラクターによる継承

  26. 26

    引数が初期化子リストであり、パラメーターが参照である場合の過負荷解決

  27. 27

    Kotlinの1つのクラスとインターフェースによる多重継承

  28. 28

    インターフェイスの継承と過負荷

  29. 29

    多重継承におけるクラスメンバーの曖昧性解消

ホットタグ

アーカイブ