未调用C ++重写函数

时间:2015-11-26 10:33:45

标签: c++ inheritance polymorphism override dynamic-binding

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

在文件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()。 (我已经搜索了一下,并阅读了几十个有超载问题的帖子,但没有看到类似的问题)

有人能指出我正确的方向吗?谢谢!

3 个答案:

答案 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 ++的日志时间,但是我记得你应该让向量内容是纯虚函数的类。

这应该强迫它查找正确的方法。

这里有一个堆栈溢出答案,这有点相关:

Pure Virtual Class and Collections (vector?)