純粋仮想関数は、仮想的なメンバー関数であり、純粋指定子(= 0;
)
第10.4条第2項C++03 では抽象クラスとは何かが説明されており、補足として次のことが説明されています。
[注: 関数宣言では純粋指定子と定義の両方を指定することはできません - 注記終了] [例:
struct C {
virtual void f() = 0 { }; // ill-formed
};
[例終了]
この問題にあまり詳しくない人は、純粋仮想関数は定義を持つことができるしかし、上記の条項は、そのような定義がインライン(語彙的にはクラス内)に現れることを禁じています。(純粋仮想関数の定義の使用については、例えば、このGotW)
現在、他のすべての種類とタイプの関数については、クラス内定義を提供することが許可されており、この制限は一見すると完全に人為的で説明のつかないものに見えます。考えてみると、2 回目以降に見るとそう思えます :) しかし、特定の理由がなければ、制限は存在しないと思います。
私の質問は、知る具体的な理由は何ですか?良い推測も歓迎します。
ノート:
- MSVC では PVF にインライン定義が許可されています。驚かないでください :)
- この質問の単語
inline
は、列をなしてキーワード。授業中の語彙
ベストアンサー1
SOスレッドで「純粋仮想関数が 0 で初期化されるのはなぜですか?」ジェリー・コフィンはビャーネ・ストロストルップのC++ の設計と進化、セクション§13.2.3で、関連性があると思われる部分に強調を追加しました。
当時、新しいキーワード pure または abstract を導入するという明白な代替案よりも、この奇妙な
=0
構文が選ばれました。なぜなら、新しいキーワードが受け入れられる見込みがなかったからです。私が pure を提案していたら、リリース 2.0 は抽象クラスなしで出荷されていたでしょう。より優れた構文と抽象クラスのどちらかを選べるとしたら、私は抽象クラスを選びました。遅延のリスクを冒して pure をめぐる争いに巻き込まれるよりも、私は 0 を「存在しない」を表すために使用するという C と C++ の伝統的な慣例に従いました。この=0
構文は、関数本体は関数の初期化子であるという私の見解また、仮想関数のセットが関数ポインタのベクトルとして実装されているという(単純だが通常は適切な)見方も採用しています。[ … ]
そのため、Bjarne は構文を選択する際に、関数本体を宣言子の一種の初期化子部分として考え、=0
初期化子の代替形式として、「本体がない」(彼の言葉で言えば、「存在しない」) ことを示すものとして考えていました。
その概念的な絵の中で、「そこに存在しない」ことを示すことと、身体を持つことの両方が不可能であることは当然です。
または、まだ概念図では、2 つの初期化子があります。
さて、私のテレパシー能力、グーグル検索、そしてソフトな推論の限界はここまでです。この純粋に構文上の制限を解除し、それに伴うすべての作業を実行することについて委員会に提案するほどの関心を持った人は誰もいないのではないかと思います。そのため、まだその状態です。