虚函数不称为c ++

Day*_*mer 2 c++ inheritance virtual-functions

我有:

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;
};
Run Code Online (Sandbox Code Playgroud)

可以看出,performDeliveryDay()是一个非虚函数,只有打印函数是虚函数,因为我想在派生类型中打印额外的信息.

在非虚函数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);
};
Run Code Online (Sandbox Code Playgroud)

派生类中的打印功能的实现是:

void ProfessionalDeliveryVehicle::PrintDailySummary(int dailyProfit, int numberOfDeliveries){
    DeliveryVehicle::PrintDailySummary(dailyProfit, numberOfDeliveries);

    // print some extra statistics
}
Run Code Online (Sandbox Code Playgroud)

在程序中我有一个基本指针队列,可以指向基类或派生类.

对于队列中的每个元素,我调用函数performDeliveryDay().我希望看到派生类对象的额外打印.由于某种原因我没有看到它们,只有基本方法的印刷.当我将断点放在派生类的打印功能中时,我看到它甚至没有输入.

有人可以指出我的问题吗?谢谢

编辑: Etienne Maheu指出了这个问题.打印功能之间存在不匹配 - "const"部分 - 签名.问题解决了.

Eti*_*heu 11

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

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

void PrintDailySummary(int dailyProfit, int numberOfDeliveries);
Run Code Online (Sandbox Code Playgroud)

注意:如果您使用的是C++ 11,则可能需要使用override关键字来声明对编译器的覆盖意图.这将有助于在编译时捕获此类错误.

  • 这就是为什么在C++ 11中应该总是在一个旨在覆盖虚拟的函数上使用[`override`](http://en.cppreference.com/w/cpp/language/override).这将导致编译器抱怨这样的错误. (6认同)
  • @Day_Dreamer:正确. (2认同)