C++相当于简单的Java多态

spi*_*rap 2 c++ java polymorphism

我正在努力克服C++中看似简单的任务.我正在尝试实现基本的OOP多态性.

考虑这个Java示例:

interface Bob
{
   void foo();
}

class ActualBob implements Bob
{
   void foo()
   {
      /* I like foo things */
   }
}

class Jane
{
    Bob bob;
}
Run Code Online (Sandbox Code Playgroud)

简可以有任何鲍勃,很容易:

Jane jane = new Jane();
jane.bob = new ActualBob();
jane.bob.foo(); // actualbob things
Run Code Online (Sandbox Code Playgroud)

现在,在C++中,这似乎有点涉及......我需要输入什么来获得上述行为?

换句话说,我想有一个抽象基类的成员变量,但是想用它们做实际的实现.

class Bob
{
public:
   virtual void foo() = 0;
}

class ActualBob : public Bob
{
public:
    void foo(){/* I like foo things */}
}

class Jane
{
public:
    Bob bob;
}
Run Code Online (Sandbox Code Playgroud)

在这里采取捷径,但我想用C++做:

jane.bob.foo(); // does ActualBob things
Run Code Online (Sandbox Code Playgroud)

另外,我可以有一个std::vector<Bob>包含ActualBob实例吗?

vla*_*don 6

使用指针,智能指针,如下所示:

class Bob
{
public:
   virtual void foo() = 0;
}

class ActualBob : public Bob
{
public:
    void foo() override {/* I like foo things */}
}

class Jane
{
public:
    std::unique_ptr<Bob> bob;
}
Run Code Online (Sandbox Code Playgroud)

在这里采取捷径,但我想用C++做:

jane.bob.foo(); // does ActualBob things
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

jane.bob->foo(); // does ActualBob things, if `bob` is a pointer to ActualBob
Run Code Online (Sandbox Code Playgroud)

另外,我可以有一个std::vector<Bob>包含ActualBob实例吗?

是的,通过一些修改,你可以拥有std::vector<Bob*>(但你必须自己释放内存),或者更好的是,一些智能指针,如std::vector<std::unique_ptr<Bob>>.