我遇到的问题是没有调用重载函数,而是调用基函数。我怀疑这与项目文件之间的分配方式有关。
在文件obj1.h / obj1.cpp我有类似的东西
class obj1{
public:
void print();
};
void obj1::print(){
cout << "obj1::print()";
}
在文件obj2.h / obj2.cpp中我有这样的东西:
#include "obj1.h"
class obj2 : public obj1{
public:
void print();
};
void obj2::print(){
cout << "obj2::print()";
}
在单独的文件中,我这样做:
#include "obj1.h"
class obj3{
public:
vector<obj1*> objlist;
void printobjs();
void addobj(obj1* o);
};
void obj3::printobjs(){
vector<obj1*>::iterator it;
for (it=objList.begin(); it < objList.end(); it++)
(*it)->print();
void obj3::addobj(obj1* o){
objlist.push_back(o);
}
然后在另一个文件中:
#include "obj2.h"
obj3 o3;
main(){
obj2* newobj2;
newobj2 = new obj2();
o3.addobj(newobj2);
o3.printobjs();
我的问题是printobjs()会导致调用obj1.print()。 (我已经搜索了一下,并阅读了几十个有超载问题的帖子,但没有看到类似的问题)
有人能指出我正确的方向吗?谢谢!
答案 0 :(得分:4)
print
不是虚函数,因此您只是依赖于静态调度。这将根据对象的静态类型选择要调用的函数,在这种情况下为obj1
。
你应该print
虚拟:
class obj1{
public:
virtual void print();
};
然后,如果您使用C ++ 11,为了安全起见,您可以将obj2::print
标记为override
:
class obj2 : public obj1{
public:
void print() override;
};
另请注意,您永远不会为newobj2
分配任何内存。
答案 1 :(得分:1)
你应该将print()
声明为obj2 :: print()的obj2对象。
virtual void print();
答案 2 :(得分:-1)
我不完全确定,这是因为我做了c ++的日志时间,但是我记得你应该让向量内容是纯虚函数的类。
这应该强迫它查找正确的方法。
这里有一个堆栈溢出答案,这有点相关: