与类成员对象的多态性

时间:2012-09-02 15:15:36

标签: c++ class polymorphism virtual

我想知道当你正在操作的对象存储在一个类(而不是指针或引用类型)中时,C ++中的多态如何工作。

我已经读过多态性只能用于指针和引用,但是我已经超载了<<<<<<<运算符,它将引用A。

在我的实现中测试这个例子时,我发现它没有按预期工作,并将返回基类字符串(" A")而不是" B"。

这是因为对象存储在类本身中吗?并且<<参与运算符与多态性的工作无关? (即因为它的核心对象存储在类中,除非我将它作为指针/引用存储在类中,否则它将无法工作) 感谢

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();
}

1 个答案:

答案 0 :(得分:2)

你班上有A个对象,所以当你这样做时:

object_ = B();

RHS上的B对象被切片。见object slicing。这与作为类成员的对象无关,可以用更简单的示例来说明:

int main()
{
  B b;
  A a;
  a = b;
  std::cout << a << "\n";
}