如何在子类的向量上应用多态函数

时间:2019-04-26 08:07:22

标签: c++ class vector

在c ++和多态性方面遇到麻烦。我意识到这是一个非常简单的问题,但是我真的在从Java到c ++的转变中挣扎,尤其是在指针方面。

我有一个“玩具”类,并且从中继承了“娃娃”和“汽车”类。在每个类中,我都有一个名为printToy()的函数;我有一个可容纳娃娃,玩具和汽车对象的向量。我想遍历在每个索引处调用“ printToy()”的向量,但是当我这样做时,它调用了Toy类的方法,因此为我提供了“ Toy Toy Toy”而不是“ Toy Doll Car”的输出。感谢任何可以帮助我的人!

这里是示例:

class Toy{
    public:
    void printToy(){
        std::cout<<"Toy"<<std::endl;
    }
};

class Doll: public Toy{
    public:
    void printToy(){
        std::cout << "Doll" << std::endl;
    }
};

class Car: public Toy{
    public:
    void printToy(){
        std::cout << "Car" << std::endl;
    }
};


int main(){
    std::vector<Toy> toys;

    Toy toy;
    Doll doll;
    Car car;

    toys.push_back(toy);
    toys.push_back(doll);
    toys.push_back(car);

    for(int i = 0; i < toys.size(); i++){
        toys[i].printToy();
    }

    return 0;
}

1 个答案:

答案 0 :(得分:1)

首先,您的printToy函数应为virtual。否则,将不涉及多态性。 (感谢发表评论!)

您的向量存储Toy,仅存储Toy。不涉及多态性。为了使用运行时多态性,必须存储指针等(unique_ptrreference_wrapper a等)而不是普通对象。像这样:

std::vector<Toy*> toys;
toys.emplace_back(&car);
toys.emplace_back(&doll);

for (auto& toy : toys)
    toy->printToy();