2015-11-26 4 views
0

Я столкнулся с проблемой, когда перегруженная функция не вызывается, а вместо нее вызывается базовая функция. Я подозреваю, что это связано с разделом вещей между файлами проекта.C++ переопределенная функция не называется

В файлах 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

функция должна быть 'virtual' за то, что вы хотите. –

ответ

1

Вы должны объявить print() виртуальным вызовом obj2 :: print() для объектов obj2.

virtual void print(); 
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

Я не совсем уверен, это время регистрации, так как я сделал C++, но, как я помню, у вас должно быть содержание векторов классов с чистыми виртуальными функциями.

Это должно заставить его искать правильный метод.

Существует переполнение стека здесь ответ, который немного связан:

Pure Virtual Class and Collections (vector?)

+1

Нет необходимости в чистых виртуальных функциях. –

+0

Спасибо, что на месте. Я проснулся здесь: http://stackoverflow.com/questions/1306778/c-virtual-pure-virtual-explained – user2692263

Смежные вопросы