0

Stephen Prata の本「C++ Primer Plus VI Edition」で、抽象クラスで純粋なメソッドの定義を記述できることを読みました。void pure() = 0たとえば、このクラスでそのメソッドの定義を作成できることを理解しました。それ= 0はクラスを抽象化するためだけであり、そのクラスを継承する別のクラスを作成する場合、それを上書きする必要はないと考えました(「上書き」という言葉が正しいかどうかはわかりませんが、したくないという意味でした) 2 次クラスに同じ名前のメソッドを記述して、基本クラスからメソッドを非表示にします)。

コンパイラで確認したところ、「オーバーライドがありません」という警告が表示されました。したがって、この純粋仮想メソッド (抽象クラスの定義を含む) を二次クラスで上書きする必要がある場合、基本クラスからこの定義を使用するにはどうすればよいですか? 無駄ですか?

4

3 に答える 3

1

純粋関数の概念を説明する例を次に示します

#include <iostream>

struct A
{
    virtual ~A() = default;
    virtual void what() const = 0;
};

void A::what() const 
{ 
    std::cout << "struct A"; 
}

struct B : A
{
    virtual void what() const = 0;
};

void B::what() const 
{ 
    A::what();
    std::cout << ", struct B : A"; 
}

struct C : B
{
    void what() const;
};

void C::what() const 
{ 
    B::what();
    std::cout << ", struct C: B"; 
}


int main() 
{
//  A a; compiler error
//  B b; compiler error
    C c;

    const A &rc = c;

    rc.what();
    std::cout << std::endl;

    return 0;
}

プログラムの出力は

struct A, struct B : A, struct C: B

この例では、クラス A と B は純粋仮想関数を持っているため抽象的ですが、それぞれが純粋仮想関数の対応する定義を提供します。

また、仮想関数を非純粋仮想関数として再宣言するため、クラス C のみが抽象ではありません。

于 2015-05-31T19:13:23.010 に答える
1

あなたはこのようなものを探していますか:

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

// A pure virtual function can still be defined.
// It has to be defined out-of-class.
void Abstract::f() {
  // Do something
}

class Concrete : public Abstract {
public:
  void f() {
    Abstract::f();  // call base class implementation
    // Do something more
  }
};
于 2015-05-31T18:49:44.960 に答える