24
class Foo
{
public: 
    virtual int foo() final = 0;
};

正常にコンパイルします。

Fooただのスペースの無駄遣いや、製作中の事故ではありませんか?それとも私は何かが足りないのですか?

4

3 に答える 3

16

あなたが言ったように、それはほとんど完全なスペースの無駄です。これには、明らかに考案された使用法が少なくとも1つあります。ちなみに、それがコンパイルされるという事実は驚くべきことではありません。コードが正当である限り、コンパイルするのに「意味がある」必要はありません。

Fooポリシーとして使用するとします。つまり、テンプレートパラメータとして使用されますが、インスタンス化する必要はありません。実際、クラスをインスタンス化することを誰にも望んでいません(確かに、理由はわかりませんが、何が問題になる可能性がありますか)。

これはまさにあなたがここに持っているものです。手を置くことができるタイプのクラスですが、インスタンス化することはできません(ただし、コンストラクターをプライベートにする方がはるかに簡単です)。

enum追加のボーナスとして、クラススコープ内にsまたは静的関数を追加できます。これらは実際にインスタンス化せずに使用でき、そのクラスの名前空間内にあります。したがって、主に型としてのみ使用できるクラスがありますが、静的関数の形式で「いくつかの機能」がバンドルされています。

ほとんどの場合、そのようなものを名前空間にラップするだけですが、状況によっては、これが望ましい方法である可能性があることを誰が知っていますか。

于 2012-12-14T15:08:48.737 に答える
9

Fooは単なるスペースの無駄ではありません

確かにそうです。抽象的であるためインスタンス化できません。また、関数をオーバーライドして非抽象派生クラスを作成することもできません。

何らかの理由でインスタンス化を行いたい場合は、クラスがインスタンス化されないようにする方法として使用できます。しかし、それでも、デフォルトのコンストラクターを削除する方がおそらく理にかなっています。

と製作中の事故?

あまり。クラスでは何もできないので、何も悪いことはできません。

于 2012-12-14T14:47:33.373 に答える
4

9.2の文法を正しく読んでいる場合、これは実際には合法ですが、それを禁止しているメモの何かを見逃している可能性があります。

member-declarator:declarator virt-specifier-seq(opt)pure-specifier(opt)

次に、それがvirt-specifier-seq可能でfinalありpure-specifier= 0

これを利用するコーナーケースがあるかもしれませんが、これが役立つ方法はわかりません。

于 2012-12-14T14:55:39.177 に答える