2

という名前のクラスがあるとしましょうFileFileたとえば、のすべての息子のコピーコンストラクターを無効にしたいTextFile

このようなことをしても、のコピー コンストラクターは無効になりますTextFileか?

class File {
public:
    File(const File& f) = delete;
};

class TextFile:public File {
public:
};

または、これを無効にするためにこれが必要ですか?

class File {
public:
    File(const File& f) = delete;
};

class TextFile:public File {
public:
    TextFile(const TextFile& tf) = delete;
};
4

2 に答える 2

4

最初のコード ブロックだけで十分です。Fileコンパイラがコピーコンストラクタを生成するときにコピーできないため、合法的なコピーコンストラクタを作成できないため、それTextFileを確認して暗黙的に削除します。

ただし、派生クラスで独自のコピー コンストラクターを作成できないようにすることはできません。あなたがそれで大丈夫なら、それはあなたが必要とするすべてです。

于 2019-09-18T12:55:47.007 に答える
2

派生クラスのコピー コンストラクターも、最初のコード スニペットで暗黙的に削除されます。

C++ 17 標準から (15.8.1 コピー/移動コンストラクター)

10 暗黙的に宣言されたコピー/移動コンストラクターは、そのクラスのインライン パブリック メンバーです。クラス X のデフォルトのコピー/移動コンストラクターは、X が次の場合に削除済み (11.4.3) として定義されます。

(10.1) — オーバーロードの解決 (16.3) が M の対応するコンストラクターを見つけるために適用されるため、コピー/移動できない潜在的に構築されたサブオブジェクト型 M (またはその配列)デフォルトのコンストラクタ、

ただし、コードの自己文書化のために、派生クラスでコピー コンストラクターが削除されることを明示的に指定できます。

于 2019-09-18T12:55:30.933 に答える