多态性和对象存储

时间:2014-01-27 21:16:23

标签: c++ inheritance polymorphism

0我在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

除了Python-on-the-brain之外还有什么?

1 个答案:

答案 0 :(得分:3)

test的返回类型为Base。这意味着它仅返回BaseBase s。将不会从该函数返回AliceBob s。当您执行return Alice();return Bob();这些对象的Base部分时,切片并返回。

同样,a中的对象bmain属于Base类型,而且它们都是“{1}}”。这就是为什么当您致电hello时,您正在调用Base实施。

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

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

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

您需要将ab设为Base*,然后使用a->hello()调用hello。但是,如果您动态分配这样的对象,则必须记住delete它们。更好的是,使用像std::unique_ptr这样的智能指针,多态性仍然有效。

另请注意,如果要以多态方式使用这些类型,则应实现虚拟析构函数。