6

派生クラスへのポインターのプログラムを作成しています。コードは次のとおりです。

 #include <iostream>
    using namespace std;

    class base {
      int i;
    public:
      void set_i(int num) { i=num; }
      int get_i() { return i; }
    };

    class derived: public base {
      int j;
    public:
      void set_j(int num) {j=num;}
      int get_j() {return j;}
    };

    int main()
    {
      base *bp;
      derived d[2];

      bp = d;

      d[0].set_i(1);
      d[1].set_i(2);

      cout << bp->get_i() << " ";
      bp++; 
      cout << bp->get_i(); 

      return 0;
    }

プログラムは 1 つの正しい値とその他の不要な値を表示しています。

bp++;

クラスの派生型ではなく、クラスの基本型の次のオブジェクトを指すようにポインターをインクリメントしています。

書くことで答えを正しく表示できます

> bp =& d[0];   
bp1=&d[1];  
 d[0].set_i(1);  
 d[1].set_i(2);

ただし、2 つのポインターを割り当てる必要があります。同様に、100 個の値を取得する必要がある場合は、100 個のポインターを割り当てる必要があります。これは良くありません。

私の質問は、配列の値を単一のポインターで表示できるかということです。

4

5 に答える 5

3

あなたがやろうとしていることをすることはできません。

派生サイズのオブジェクトの配列を作成しています。配列への基本ポインターを使用する場合、ポインターを基本のサイズだけ移動しようとしています。Derived * の配列がある場合は、ベース * * でそれらを指すことができ、すべてが機能します。実際のオブジェクトがある場合は、正しいデータ型を使用する必要があります。

これを実現したい唯一の理由は、基本クラスの多態性機能を利用することです。ポリモーフィズムは、ポインターと refrecnes でのみ機能するため、実際のオブジェクトを保存してもほとんど役に立ちません。

于 2013-08-30T19:43:32.040 に答える
2

派生クラスを指すために基本クラスのポインターを使用することを主張する場合、反復に ++ を使用できませんでした。これを行う必要があります:

bp = d;
.
.
.
bp = &d[1];
于 2013-08-30T19:46:35.217 に答える
1
  • C++ では、ポインターを配列として使用して、さまざまな種類のオブジェクトを格納できます。
  • 配列ポインターを作成するには、ポインター変数を宣言し、MALLOC または NEW を使用してメモリを割り当てるだけです。だからあなたは持っているでしょう。
  • base *bp = (base *)malloc(sizeof(10)/sizeof(base));
  • これにより、サイズ 10 のポインター配列が作成されます。その後、このポインターを使用して、基本オブジェクトまたは派生オブジェクトを格納できます。また、for ループを使用して、10 個の要素のポインターを反復処理することもできます。
于 2013-08-30T22:09:05.623 に答える