c++ - 如何在子类的 vector 上应用多态函数

标签 c++ class vector

<分区>

在 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_ptrs、reference_wrappera 等)而不是普通对象。像这样:

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/

相关文章:

c++ - 修复(锁定)std::vector 的大小

c++ - 段错误: 11 c++ when using vector

c++ - 如何使用 C++ 读取 sqlite 数据。?

c++ - 将 OpenCV 原始指针和 lambda 用于直方图的不同结果

R 中的类 : S3 vs S4

C#泛型,传递类

Python - 定义对象返回值

c++ - 代码意外编译失败。为什么?

c++ - boost::unordered_map 是否返回值的引用或拷贝

c++ - 转换整个 vector