2

操作しているオブジェクトがクラス内に (ポインターまたは参照型としてではなく) 格納されている場合、C++ のポリモーフィズムがどのように機能するのか疑問に思っています。

ポリモーフィズムはポインターと参照でのみ機能することを読みましたが、A への参照を受け取る << 演算子をオーバーロードしました。

私の実装でこの例をテストしたところ、期待どおりに動作せず、「B」ではなく基本クラスの文字列 (「A」) が返されることがわかりました。

これは、オブジェクトがクラス自体の中に格納されているためですか? 参照を受け取る << 演算子は、ポリモーフィズムの働きとは何の関係もありませんか? (つまり、オブジェクトのコアはクラスに格納されているため、クラスにポインタ/参照として格納しない限り機能しません)ありがとう

class Test {

    public:
       void Run() {
           object_ = B();
           std::cout << object_ << std::endl;
       }


    private:
       A object_;
};

Class A {
    // Assume this is already implemented. All it does it add obj.getType()
    // to stream
    friend ostream& operator<<(ostream& stream, A obj);

    public:
      virtual std::string getType() {
             return std::string("A");
      }
};

Class B : public A {
    public:
      std::string getType() {
            return std::string("B");
      }
};

int main(int argc, char* argv[]) {
    Test test = Test();
    test.Run();
}
4

1 に答える 1

2

Aクラスにオブジェクトがあるので、これを行うと:

object_ = B();

BRHS 上のオブジェクトがスライスされます。オブジェクトのスライスを参照してください。これは、クラスのメンバーであるオブジェクトとは無関係であり、より簡単な例で説明できます。

int main()
{
  B b;
  A a;
  a = b;
  std::cout << a << "\n";
}
于 2012-09-02T15:21:44.733 に答える