1

私は最近、C++ では純粋仮想関数が必要に応じて本体を持つことができることを知りました。

派生クラスから呼び出したいので仮想関数の本体が存在することはわかっているのですが、これはできますか?

class Base{
    int x;
  public:
    virtual void print()=0;
};

void Base::print(){
  cout << x;
}

class Derived : public Base{
      int y;
  public:
      void print(){
          Base::print();
          cout << y;
      }
};

結果は次のようになります: x の値と y の値?

関数 Base::print() が Derived クラスの関数から x の値を取得することを知っているとはどういう意味ですか????

4

2 に答える 2

3

次のコードの出力は「12」になるため、はい、本体を持つ純粋仮想関数が呼び出され、次に派生した出力が呼び出されます。そうです、結果は次のようになります: x の値と y の値は、ご想像のとおりです。これは有効な C++ であり、そのコンテキストで「x」を取得する方法を知っています。

効果的な C++" Scott Meyers は、純粋仮想関数が本体を持つ理由について言及しています。この純粋仮想関数を実装する派生クラスは、コード内でこの実装を smwhere と呼ぶことができます。関数が純粋な仮想である必要がある場合でも、階層内でそれを上に移動する意味があります。

#include <iostream>

using namespace std;

class Base{
    int x;
  public:
    Base(): x(1) {}
    virtual void print()=0;
};

void Base::print(){
  cout << x;
}

class Derived : public Base{
      int y;
  public:
      Derived(): Base(), y(2) {}
      void print(){
          Base::print();
          cout << y;
      }
};

int main()
{
    Derived d;
    d.print();
    return 0;
}

出力:12

于 2013-08-24T11:02:05.613 に答える