我遇到了一个问题,没有调用重载函数,而是调用了基函数。我怀疑这与项目文件之间的划分方式有关。
在文件obj1.h/obj1.cpp中,我有这样的
class obj1{
public:
void print();
};
void obj1::print(){
cout << "obj1::print()";
}
在文件obj2.h/oj2.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()。(我搜索了一下,读了几十篇关于过载问题的帖子,但没有看到类似的问题)
有人能给我指出正确的方向吗?谢谢
print
不是一个虚拟函数,所以您只是依赖于静态调度。这将根据对象的静态类型选择要调用的函数,在本例中为obj1
。
您应该使print
虚拟化:
class obj1{
public:
virtual void print();
};
然后,如果您使用C++11,出于安全考虑,可以将obj2::print
标记为override
:
class obj2 : public obj1{
public:
void print() override;
};
还要注意,您从未为newobj2
分配任何内存。
您应该将print()
声明为虚拟,以便为obj2对象调用obj2::print()。
virtual void print();
我不完全确定,自从我做c++以来,现在是日志时间,但我记得向量的内容应该是具有纯虚拟函数的类。
这应该会迫使它寻找正确的方法。
这里有一个堆栈溢出的答案,与此略有关联:
纯虚拟类和集合(vector?)