0

[] 演算子の値を作成する関数を継承して上書きできるクラスが必要です。これらが同じ結果にならないのはなぜですか? ポインターを使用せずに 2 番目の結果を取得する方法はありますか?

コード:

#include <iostream>

using std::cout;

class session {
  public:
    session(){}
    ~session(){}
    void operator[](const char* c) {foo(c);}

  protected:
    virtual void foo(const char* c) {cout << "parent called" << "\n";}
};

class session2 : public session {
  public:
    session2(){}
    ~session2(){}

  protected:
    virtual void foo(const char* c) {cout << c << "\n";}
};

int main() {
  session2 s2;

  session a = s2;
  a["child called"];

  session* b = &s2;
  (*b)["child called"];

  return 0;
}

出力:

parent called
child called
4

2 に答える 2

1
session a = s2;

これは、「新しいsessionオブジェクトを作成し、 の値から初期化する」という意味ですs2aはオブジェクトであり、sessionオブジェクトではないことに注意してくださいsession2。したがって、仮想メソッドは「親」の定義を使用します。したがって、ランタイム ポリモーフィズムは、新しいオブジェクトを作成しない参照とポインターを介してのみ機能します。それらは単に既存のオブジェクトを参照します。

于 2013-08-01T21:18:31.200 に答える
1

ポインターを使用したくない場合は、参照を使用してください。

session2 s2;

session& a = s2;

ポインターまたは参照を使用しない場合、スライスが行われ、派生オブジェクトに関するすべての特別な要素が失われます。親のパーツだけが残ります。

スライシングについて詳しくは、オブジェクトのスライシングとは?

于 2013-08-01T21:20:52.323 に答える