c++ - 多态性和对象存储

标签 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)?

最佳答案

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

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

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

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

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

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

还要注意,如果你想以多态方式使用这些类型,你应该实现一个虚拟析构函数。

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

相关文章:

c++ - 如何在没有子类化的情况下挂接特定的 Windows 消息?

c# - 如何在 C# 中干净地设计并行继承结构?

c++ - 多态,为什么我做不到?

c++ - 从基类向下转换时是否可以调用派生对象的虚方法?

c# - 在没有 typeNameHandling 的情况下将 Json 对象反序列化为多态 C# 对象

c++ - 禁用 Visual Studio 绿色箭头按钮移动指令指针

c++ - LevelDB 与 std::map

c++ - C(嵌入式): Code size does not shrink when commenting FreeRTOS' RootTask

Java - 使用条件在 super 方法中指定参数

java - 在Java中访问子类中父类(super class)的 "final"字段(并更新它们)