0

クラスが抽象クラス (オブジェクトを作成できないクラス) であるかどうかを内部的にコンパイラが識別する方法は?

4

4 に答える 4

1

抽象クラスには、少なくとも 1 つの純粋仮想関数が含まれます。このようなもの

virtual void foo() = 0;

これから派生し、このような関数をオーバーライドしないクラスも抽象になります

于 2012-10-03T07:14:39.950 に答える
0

コンパイラは、クラスまたはその派生元のクラスの純粋仮想関数をチェックするのに十分スマートです。

クラス自体が純粋仮想関数[参照 1]を定義している場合、関数本体を定義しているかどうかに関係なく、Abstract クラスとしてフラグが立てられます。

クラスが純粋仮想関数を持つクラスから継承する場合、純粋仮想関数の定義を提供する必要があります。そうでない場合は、Abstract としてフラグが立てられます。

[参照 1]

virtual void doSomething() = 0;
                          ^^^^^

PS: はい、純粋仮想関数は定義を持つことができます。

于 2012-10-03T07:14:21.327 に答える
0

もちろん、定義を調べて、それが抽象クラスの定義内にあるかどうかを確認します。他にどのようにこれが起こるでしょうか?

于 2012-10-03T07:14:44.023 に答える
0

クラスのメンバーの少なくとも 1 つが抽象である場合、クラスは抽象です。したがって、クラスに少なくとも 1 つの純粋仮想関数が含まれている場合、それはコンパイラの観点からは抽象的です。

virtual void PureVirtualMethod() = 0;   // Any class that has methods
                                        // with such declaration is abstract.
于 2012-10-03T07:16:45.190 に答える