This question already has answers here:
What is object slicing?

(18个回答)



Why do we need virtual functions in C++?

(26个答案)


去年关闭。




在使用c++和多态性时遇到麻烦。我意识到这是一个非常简单的问题,但是我真的在为从Java到c++的迁移而苦苦挣扎,尤其是在指针方面。

我有一个“玩具”类,并且从中继承了“娃娃”和“汽车”类。在每个类中,我都有一个名为printToy()的函数;我有一个可容纳娃娃,玩具和汽车对象的 vector 。我想遍历在每个索引处调用“printToy()”的 vector ,但是当我这样做时,它调用了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;
}

最佳答案

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

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

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

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

关于c++ - 如何在子类的 vector 上应用多态函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55863357/

10-10 05:11