C++ 虚拟函数不称为c++;

C++ 虚拟函数不称为c++;,c++,inheritance,virtual-functions,C++,Inheritance,Virtual Functions,我有: class DeliveryVehicle{ public: //c'tor DeliveryVehicle(const char* ID, Quality quality); //d'tor virtual ~DeliveryVehicle(); int performDeliveryDay(int* numberOfDeliveries); ... protected: ...

我有:

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()是一个非虚拟函数,只有printing函数是虚拟的,因为我想在派生类型中打印额外的信息

在非虚拟函数performDeliveryDay()内调用Virtual PrintDailySummary()

[我不添加performDeliveryDay()的实现-如果相关,我将编辑我的帖子]

此外,我还有一个派生类:

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()。 我希望看到派生类对象的额外打印。 出于某种原因,我没有看到它们,只有基本方法的打印。 当我将断点放在派生类的printing函数中时,我看到它甚至没有输入

有人能指出我的问题吗? 谢谢

编辑:Etienne Maheu指出了问题所在。 打印功能-“const”部分签名之间存在不匹配。
问题已解决。

派生类的虚拟方法没有相同的签名。它缺少
const
限定符。可能还需要根据您的使用情况指定默认值

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

void PrintDailySummary(int dailyProfit, int numberOfDeliveries);

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

这就是为什么在C++11中,应该始终对用于重写虚拟对象的函数使用。这将导致编译器抱怨类似这样的错误。使用本可以防止此错误。因此,实际上我只是隐藏了虚拟函数(错误地),而不是覆盖它?@Day\u Dreamer:正确。