📌  相关文章
📜  mingw32 bin ld.exe: C:\Users\mfrom\AppData\Local\Temp\ccSKcRks.o:PizzaPi.cpp:(.text$_ZN5PizzaC2Ev[__ZN5PizzaC2Ev]+0xa): undefined reference to `vtable for Pizza' collect2.exe : 错误: ld 返回 1 个退出状态 - C++ (1)

📅  最后修改于: 2023-12-03 14:44:18.717000             🧑  作者: Mango

c++编译错误:undefined reference to `vtable for Pizza'

这个错误往往发生在使用继承和多态的时候。在C++中,当一个类中含有至少一个虚函数时,会自动生成一个虚函数表(vtable),用于存储该类的虚函数地址。而当一个子类继承父类时,会继承父类中的虚函数表,并在其自己的虚函数表中添加新的虚函数。因此,当我们创建一个子类的对象时,该对象的虚函数表指针会指向该子类的虚函数表。

但如果子类没有实现父类的虚函数,就会出现'undefined reference to `vtable for Pizza'的错误。这是因为编译器在编译时无法确定该子类的虚函数表的大小和函数地址,因此在链接时就会出现错误。

解决方法:

检查子类是否正确实现了父类的虚函数,如果没有正确实现,就需要在子类中重写该虚函数,并在其函数体中调用父类的虚函数。

代码示例:

class Pizza{
public:
    virtual void makePizza() {
        //父类的虚函数
    }
};

class AmericanPizza : public Pizza{
public:
    void makePizza() override {
        //子类的虚函数,实现父类的虚函数
        Pizza::makePizza();
        //其他操作
    }
};

int main() {
    Pizza *pizza = new AmericanPizza();
    pizza->makePizza(); //调用子类的虚函数
    delete pizza;
    return 0;
}

在这个示例中,AmericanPizza正确实现了父类Pizza的虚函数makePizza,而且在其函数体中使用了Pizza::makePizza()调用了父类的虚函数实现。这样,在运行中调用子类的makePizza时,也会自动调用父类的makePizza。