虚函数没有被调用 C++。

3

我遇到了以下问题:

class DeliveryVehicle{
public:
    //c'tor
    DeliveryVehicle(const char* ID, Quality quality);

    //d'tor
    virtual ~DeliveryVehicle();

    int performDeliveryDay(int* numberOfDeliveries);
    ...
protected:
    ...                 

        /* PrintDailySummary: here numberOfDeliveries is a "dummy" parameter but 
        it would be used in the ProfessionalDeliveryVehicle overriding function */
        virtual void PrintDailySummary(int dailyProfit, int numberOfDeliveries = 0) const;
};

可以看到performDeliveryDay()是一个非虚函数,只有打印函数是虚的,因为我想在派生类型中打印额外的信息。
在非虚函数performDeliveryDay()中调用了虚函数PrintDailySummary()。
此外,我有一个派生类:
class ProfessionalDeliveryVehicle:public DeliveryVehicle {
public:
    //c'tor
    ProfessionalDeliveryVehicle(const char* ID, Quality quality):
                                DeliveryVehicle(ID,quality) {}

    //d'tor
    // Vehicle destructor is called by default

protected:
    void PrintDailySummary(int dailyProfit, int numberOfDeliveries);
};

派生类中打印功能的实现如下:
void ProfessionalDeliveryVehicle::PrintDailySummary(int dailyProfit, int numberOfDeliveries){
    DeliveryVehicle::PrintDailySummary(dailyProfit, numberOfDeliveries);

    // print some extra statistics
}

在程序中,我有一个指向基类或派生类的基础指针队列。
对于队列中的每个元素,我调用performDeliveryDay()函数。 我期望看到派生类对象的额外打印内容。 但出于某种原因,我只看到了基本方法的打印。 当我在派生类的打印函数内设置断点时,我发现它甚至没有进入。
有人能指出我的问题吗? 谢谢
编辑:Etienne Maheu指出了问题。 打印函数之间存在“const”部分不匹配的签名。 问题已解决。
1个回答

11

你派生类的虚函数签名不一样。它缺少了const限定符。根据你的使用情况,可能还想指定默认值。

virtual void PrintDailySummary(int dailyProfit, int numberOfDeliveries = 0) const;

void PrintDailySummary(int dailyProfit, int numberOfDeliveries);

注意:如果您正在使用C++11,您可能希望使用override关键字向编译器声明您的覆盖意图。这将有助于在编译时捕获此类错误。


6
在 C++11 中,如果想要重写一个虚函数,应该始终使用 override 关键字。这会导致编译器报告类似这样的错误。 - Fred Larson
1
使用 override 可以避免这个错误。 - David Schwartz
那么实际上我只是错误地隐藏了虚函数,而不是重写它? - Day_Dreamer
2
@Day_Dreamer:正确。 - Fred Larson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接