C++未调用覆盖的虚拟函数
C++ overridden virtual function not getting called
我有以下设置:
主.cpp:
int main()
{
vector <Tour> tourList;
Tour* tour_ptr;
for (unsigned int i = 0; i < tourList.size(); i++)
{
tour_ptr = &tourList[i];
tour_ptr->display();
}
}
旅游:
class Tour
{
public:
virtual void display();
};
行程.cpp:
void Tour::display()
{
cout << "Tour ID: " << getID() << "n";
cout << "Description: " << getdescription() << "n";
cout << "Tour Fee: $" << getfee() << "n";
cout << "Total Bookings: " << getbookings() << "nn";
}
GuidedTour.h:
class GuidedTour : public Tour
{
public:
void display();
};
导览.cpp:
void GuidedTour::display()
{
Tour::display();
cout << "Max Tour Group Size: " << getMaxTourists() << "n";
cout << "Tour Guide: " << getGuideName() << "n";
cout << "Tour Date: " << getTourDate() << "nn";
}
GuidedTour 继承自 Tour 类,我在基 Tour 类中将 display() 函数指定为虚拟函数,但由于某种原因,GuidedTour display() 函数永远不会被调用,只有基函数每次都被调用。我做错了什么?
您的代码实际上不会打印任何内容,因为std::vector
最初为空。除此之外,您的问题是由对象切片引起的(我假设您正在push_back()
GuidedTour
向量)。
当对象切片发生时,您只存储GuidedTour
对象的Tour
部分,这就是您看到Tour::display()
输出的原因。
要解决您的问题,您需要通过使用(智能)指针和动态分配对象来多态地存储对象。
int main()
{
vector <std::unique_ptr<Tour>> tourList;
for(...) {
tourList.push_back(std::make_unique<GuidedTour>(/* constructor parameters */));
...
tourList.push_back(std::make_unique<Tour>(/* constructor parameters */));
}
for (unsigned int i = 0; i < tourList.size(); i++)
{
tourList[i]->display();
}
}
请注意,我使用的是std::unique_ptr
/std::make_unique
而不是原始new
指针。使用它们可以极大地缓解手动管理和delete
对象的问题,有时[轻描淡写]是错误和未定义行为的原因。
请注意,有些人可能会建议您使用boost::ptr_vector
或类似的东西。听听他们说,特别是如果他们给你论据,说明为什么他们比替代品更好。
你的问题与你的类无关,而是你如何创建对象。 tourList 向量中的每个元素都是一个 tour,在编译时或运行时没有任何内容可以确定它们是 GuidedTours。 实际上,GuidedTour 永远不会被调用,因为我在任何地方都没有在您的主对象中看到 GuidedTour 对象。
我同意"这是皮特"。 因为您还没有使用过 GuidedTour 类。如果您使用以下方法,它将起作用。
int main()
{
vector <GuidedTour> tourList;
Tour* tour_ptr;
for (unsigned int i = 0; i < tourList.size(); i++)
{
tour_ptr = &tourList[i];
tour_ptr->display();
}
}
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数