c++ - 类成员对象的多态性

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

最佳答案

您的类中有一个 A 对象,因此当您执行此操作时:

object_ = B();

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

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

关于c++ - 类成员对象的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12237103/

相关文章:

c++ - 创建 DLL 时导出所有符号

c++ - 为什么我不能在一个类的不同行中声明和定义一个成员变量?

c++ - Sprite 和子弹不移动 C++

java - 为什么编译器不生成重复错误?

C++从类内部调用类外部的方法

generics - 通用特征对象的向量

c++ - 使用 "bitwise and"运算符 c++

ruby - 为什么不能将类用作模块?

java - 如何对 Criteria 查询执行多态显式查询?

JavaScript 多态变量继承