多态性和对象存储

Polymorphism and object storage

本文关键字:存储 对象 多态性      更新时间:2023-10-16

0i'在C 时非常生锈。我尝试了各种搜索,但无法提出答案。我有以下代码:

class Base
{
  public:
    Base() {};
    virtual void hello() { std::cout << "I'm the base class" << std::endl; }
};
class Alice : public Base
{
  public:
    Alice() {};
    virtual void hello() { std::cout << "I'm Alice" << std::endl; }
};

class Bob : public Base
{
  public:
    Bob() {};
    virtual void hello() { std::cout << "I'm Bob" << std::endl; }
};

Base test(int alice)
{
  if(alice)
    return Alice();
  else
    return Bob();
}

int main()
{
  Base a = test(0);
  Base b = test(1);
  a.hello();
  b.hello();
}

我希望输出为

I'm Alice
I'm Bob

,但它是

I'm the base class
I'm the base class

什么(除了在脑子里,还有什么?

test的返回类型是 Base。这意味着它仅返回Base S和Base S。不会从该功能返回Alice S或Bob S。当您执行return Alice();return Bob();时,这些对象的Base部分获取切成薄片 out并返回。

同样,main中的对象ab是类型Base,这就是它们的全部。这就是为什么当您在它们上调用hello时,您正在调用Base实现。

在C 中,您可以使用 Pointers 参考来利用多态性。也就是说,Base*Base&可以指向或参考AliceBob对象。然后,当您尝试通过该指针或参考调用虚拟成员函数时,该函数的适当实现将通过查看对象的运行时类型来确定。

作为一个简单的测试,您可以动态分配AliceBob对象,然后将指针返回给它们:

Base* test(int alice)
{
  if(alice)
    return new Alice();
  else
    return new Bob();
}

您需要使ab具有Base*类型,然后打Hello,例如a->hello()。但是,如果您动态分配这样的对象,则必须记住delete它们。更好的是,使用诸如std::unique_ptr之类的智能指针,多态性仍然可以起作用。

还要注意,如果要使用这些类型的多态类型,则应实现虚拟破坏者。