1

ここでの初心者の疑いのようなもの(私からの別のもの:P)

私が読んでいる本について:

  • 1つのAbstractBase-Class(ABC)は、純粋仮想メソッドの宣言によるものです。
  • メソッドを純粋仮想メソッドにする= 0のは、宣言の最後にあります。
  • 次のように宣言できvirtual void f() = 0;ます。この方法では、ABCで定義する必要はありませんが、派生クラスが独自のバージョンを実装する必要があります。
  • ただし、次のように仮想メソッドを宣言することもできます。void f() = 0;この方法では、ABCでメソッドを定義する必要があり、派生クラスはそのように使用できます。このアプローチは、メソッドがすべてその派生クラスによって一般的に適用されるABCに必要です。

上記のすべての点が当てはまる場合、私が理解していないのは、次のとおりです。正確に仮想メソッドとは何ですか。

void f() = 0;私には通常の方法のように見えるからです。ABCはそれを定義し、派生オブジェクトは他のパブリックメソッドと同じようにABCの定義を使用します。これらの2つのインスタンスに魅力的な仮想メソッドの定義はありますか?

純粋仮想関数または純粋仮想メソッドは、抽象ではない派生クラスによって実装する必要がある仮想関数です。

この定義は、このサイトの別の質問から選択されています。だから私の推測は私が読んでいる本が間違っているのですか?void f() = 0;クラスはABCであると述べていますが、純粋仮想メソッドではありません。誰かがこれを確認したり、私に説明したりできますか?

4

2 に答える 2

9
void f() = 0;

基本クラスがとして定義f()されていない限り、間違っていvirtualます。例えば:

class A
{
public:
   virtual void f() = 0;
};

class B : A
{
   void f() = 0;
}

上記f()は本質的にであるため、合法virtualです。そうでなければ、いいえ。

tl; drvirtual非仮想メソッドを純粋として宣言することはできませんが、 (継承を介して)キーワードを明示的に指定しなくてもメソッドを仮想にすることができます。私はこれが本が話していることであることを願っています、さもなければ私はそれが安っぽい悪い本。

于 2012-08-27T19:14:34.827 に答える
0

関数(C++にはメソッドがありません) は、マークされているvirtual場合、または基底クラスで仮想関数をオーバーライドしている場合、仮想です。= 0仮想関数は;で「純粋仮想」とマークできます。つまり、関数を定義する必要はなく、クラスから直接派生したクラスも、その関数 (およびその他の純粋仮想) をオーバーライドしない限り、抽象クラスです。オーバーライド関数を使用= 0して、オーバーライド機能を純粋仮想にすることもできます。

于 2012-08-27T19:20:01.663 に答える