class Foo
{
public:
virtual int foo() final = 0;
};
正常にコンパイルします。
Foo
ただのスペースの無駄遣いや、製作中の事故ではありませんか?それとも私は何かが足りないのですか?
class Foo
{
public:
virtual int foo() final = 0;
};
正常にコンパイルします。
Foo
ただのスペースの無駄遣いや、製作中の事故ではありませんか?それとも私は何かが足りないのですか?
あなたが言ったように、それはほとんど完全なスペースの無駄です。これには、明らかに考案された使用法が少なくとも1つあります。ちなみに、それがコンパイルされるという事実は驚くべきことではありません。コードが正当である限り、コンパイルするのに「意味がある」必要はありません。
Foo
ポリシーとして使用するとします。つまり、テンプレートパラメータとして使用されますが、インスタンス化する必要はありません。実際、クラスをインスタンス化することを誰にも望んでいません(確かに、理由はわかりませんが、何が問題になる可能性がありますか)。
これはまさにあなたがここに持っているものです。手を置くことができるタイプのクラスですが、インスタンス化することはできません(ただし、コンストラクターをプライベートにする方がはるかに簡単です)。
enum
追加のボーナスとして、クラススコープ内にsまたは静的関数を追加できます。これらは実際にインスタンス化せずに使用でき、そのクラスの名前空間内にあります。したがって、主に型としてのみ使用できるクラスがありますが、静的関数の形式で「いくつかの機能」がバンドルされています。
ほとんどの場合、そのようなものを名前空間にラップするだけですが、状況によっては、これが望ましい方法である可能性があることを誰が知っていますか。
Fooは単なるスペースの無駄ではありません
確かにそうです。抽象的であるためインスタンス化できません。また、関数をオーバーライドして非抽象派生クラスを作成することもできません。
何らかの理由でインスタンス化を行いたい場合は、クラスがインスタンス化されないようにする方法として使用できます。しかし、それでも、デフォルトのコンストラクターを削除する方がおそらく理にかなっています。
と製作中の事故?
あまり。クラスでは何もできないので、何も悪いことはできません。
9.2の文法を正しく読んでいる場合、これは実際には合法ですが、それを禁止しているメモの何かを見逃している可能性があります。
member-declarator:declarator virt-specifier-seq(opt)pure-specifier(opt)
次に、それがvirt-specifier-seq
可能でfinal
ありpure-specifier
、= 0
これを利用するコーナーケースがあるかもしれませんが、これが役立つ方法はわかりません。