未调用C++重写的函数



我遇到了一个问题,没有调用重载函数,而是调用了基函数。我怀疑这与项目文件之间的划分方式有关。

在文件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?)

相关内容

  • 没有找到相关文章

最新更新