在C ++中区分基指针向量中的派生对象

时间:2018-05-22 08:35:38

标签: c++ inheritance derived-class

跟进这个问题 Vector/Container comprised of different derived objects in C++我试图改进我的代码。现在我在单向量中存储指向我的派生对象的指针,但我不确定如何访问其派生类特定成员函数将单个向量拆分为子向量各个派生类型。

#include <vector>
#include <memory> // for unique_ptr
#include <iostream>

using namespace std;

class Fruit {};
class Banana: public Fruit { void cout_banana() { cout << "i am a banana" << endl; } };
class Apple : public Fruit { void cout_apple() { cout << "i am an apple" << endl; } };

class FruitBox
{
    vector<unique_ptr<Banana>> vec_banana;
    vector<unique_ptr<Apple>>  vec_apple;

public:
    FruitBox(const vector<unique_ptr<Fruit>> &fruits)
    {
        for (const unique_ptr<Fruit> &f : fruits)
        {
            // How to figure out if f is Banana or Apple and then
            // 1) Print either cout_banana or cout_apple
            // 2) Store/Move f in either vec_banana or vec_apple
        }
    }
};

void main()
{
    vector<unique_ptr<Fruit>> inputs;
    inputs.emplace_back(new Banana());
    inputs.emplace_back(new Apple());

    FruitBox fbox = FruitBox(inputs);
}

1 个答案:

答案 0 :(得分:3)

我认为你的问题不是实施本身(使用cout_xyz检查实际课程是可能的,但我不会在这里深入研究,因为这是不必要的),但是而是首先你对物体取向的理解 - 至少在这个特定的例子中。

Liskov Substitution Principle表示&#34;如果S是T的子类型,则类型T的对象可以用类型S的对象替换(即类型为T的对象可以替换为子类型S)的任何对象。&#34; 这不是这种情况。

您应该在void cout_fruit()中将class Fruit作为抽象方法编写,并在子类中覆盖它,而不是在子类中定义class Fruit { public: virtual void cout_fruit() = 0; }; class Banana: public Fruit { public: void cout_fruit() override { cout << "i am a banana" << endl; } }; class Apple : public Fruit { public: void cout_fruit() override { cout << "i am an apple" << endl; } }; // [...]

f->cout_fruit()

然后,对于每种水果,您只需拨打setTimeOut