虚函数不叫c++
virtual function is not called c++
我有:
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()是一个非虚函数,只有打印函数是虚函数,因为我想在派生类型中打印额外的信息。
Virtual PrintDailySummary() 在非虚函数 performDeliveryDay() 内部被调用
[我没有添加 performDeliveryDay() 的实现 - 如果相关,我将编辑我的 post]
此外,我已经导出 class:
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);
};
派生class中打印函数的实现是:
void ProfessionalDeliveryVehicle::PrintDailySummary(int dailyProfit, int numberOfDeliveries){
DeliveryVehicle::PrintDailySummary(dailyProfit, numberOfDeliveries);
// print some extra statistics
}
在程序中我有一个基指针队列,这些指针可能指向基或派生 class。
对于队列中的每个元素,我调用函数 performDeliveryDay()。
我希望看到派生的 class 对象的额外打印。
由于某种原因,我没有看到它们,只有基本方法的打印。
当我在派生的打印函数中放置断点时 class 我看到它甚至没有输入。
有人可以指出我的问题吗?
谢谢
编辑: Etienne Maheu 指出了这个问题。
打印函数 - "const" 部分 - 签名不匹配。
问题已解决。
您派生的 class 的虚拟方法没有相同的签名。它缺少 const
限定符。可能还想根据您的使用情况指定默认值。
virtual void PrintDailySummary(int dailyProfit, int numberOfDeliveries = 0) const;
void PrintDailySummary(int dailyProfit, int numberOfDeliveries);
注意:如果您使用的是 C++11,您可能需要使用 override
关键字向编译器声明您的覆盖意图。这将有助于在编译时捕获此类错误。
我有:
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()是一个非虚函数,只有打印函数是虚函数,因为我想在派生类型中打印额外的信息。
Virtual PrintDailySummary() 在非虚函数 performDeliveryDay() 内部被调用
[我没有添加 performDeliveryDay() 的实现 - 如果相关,我将编辑我的 post]
此外,我已经导出 class:
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);
};
派生class中打印函数的实现是:
void ProfessionalDeliveryVehicle::PrintDailySummary(int dailyProfit, int numberOfDeliveries){
DeliveryVehicle::PrintDailySummary(dailyProfit, numberOfDeliveries);
// print some extra statistics
}
在程序中我有一个基指针队列,这些指针可能指向基或派生 class。
对于队列中的每个元素,我调用函数 performDeliveryDay()。 我希望看到派生的 class 对象的额外打印。 由于某种原因,我没有看到它们,只有基本方法的打印。 当我在派生的打印函数中放置断点时 class 我看到它甚至没有输入。
有人可以指出我的问题吗? 谢谢
编辑: Etienne Maheu 指出了这个问题。 打印函数 - "const" 部分 - 签名不匹配。 问题已解决。
您派生的 class 的虚拟方法没有相同的签名。它缺少 const
限定符。可能还想根据您的使用情况指定默认值。
virtual void PrintDailySummary(int dailyProfit, int numberOfDeliveries = 0) const;
void PrintDailySummary(int dailyProfit, int numberOfDeliveries);
注意:如果您使用的是 C++11,您可能需要使用 override
关键字向编译器声明您的覆盖意图。这将有助于在编译时捕获此类错误。