2016-04-01 2 views
0

Я создал BaseClass и два подкласса: SubOne и SubTwo. После этого я создал коллекцию под названием MyCollection, которая хранит экземпляры в векторе.Вызывается метод Baseclass вместо одного в подклассе

Как базовый класс, так и подклассы имеют метод getString. Возврат базового класса с base, а подклассы - sub1 и sub2.

Во время компиляции я не получаю никаких предупреждений или ошибок. Но по какой-то причине, если я пытаюсь перебрать вектор, подклассы возвращают «базовый»

#include <iostream> 
#include <vector> 

class BaseClass { 

    public: 

     BaseClass() {} 

     std::string getString() { 
      return "base"; 
     } 

}; 

class SubOne : public BaseClass { 

    public: 

     SubOne() : BaseClass() {} 

     std::string getString() { 
      return "sub1"; 
     } 

}; 

class SubTwo : public BaseClass { 

    public: 

     SubTwo() : BaseClass() {} 

     std::string getString() { 
      return "sub2"; 
     } 

}; 

class MyCollection { 

    private: 

     std::vector<BaseClass> instances; 

    public: 

     MyCollection() {} 


     void add(BaseClass & ins) { 
      instances.push_back(ins); 
     } 

     std::string printString() { 

      for(std::vector<BaseClass>::iterator it = instances.begin() ; it != instances.end(); ++it) { 
       std::cout << it->getString() << std::endl; 
      } 

     } 

}; 

int main() { 

    MyCollection *coll = new MyCollection(); 

    SubOne* s1 = new SubOne(); 
    SubTwo* s2 = new SubTwo(); 

    coll->add(*s1); 
    coll->add(*s2); 

    coll->printString(); 

    return 0; 

} 
+0

Возможный дубликат [Что такое объект нарезка?] (Http://stackoverflow.com/questions/274626/what-is-object-slicing) –

+0

Почему бы не Это? Ваша функция не является виртуальной. И что более важно, ваш вектор имеет значение «BaseClass», а не «BaseClass &». Так что вы нарезаете. –

+0

это не дубликат –

ответ

1

Вы забыли использовать ключевое слово virtual. Также переведите указатели (кредит передается капитану Жирафу).

См код ниже:

#include <iostream> 
#include <vector> 

class BaseClass { 

public: 

    BaseClass() {} 

    virtual std::string getString() { // BINGO _!_!_!_! 
     return "base"; 
    } 

}; 

class SubOne : public BaseClass { 

public: 

    SubOne() : BaseClass() {} 

    std::string getString() { 
     return "sub1"; 
    } 

}; 

class SubTwo : public BaseClass { 

public: 

    SubTwo() : BaseClass() {} 

    std::string getString() { 
     return "sub2"; 
    } 

}; 

class MyCollection { 

private: 

    std::vector<BaseClass*> instances; 

public: 

    MyCollection() {} 


    void add(BaseClass* ins) { 
     instances.push_back(ins); 
    } 

    std::string printString() { 

     for(std::vector<BaseClass*>::iterator it = instances.begin() ; it != instances.end(); ++it) { 
      std::cout << (*it)->getString() << std::endl; 
     } 

    } 

}; 

int main() { 

MyCollection *coll = new MyCollection(); 

SubOne* s1 = new SubOne(); 
SubTwo* s2 = new SubTwo(); 

coll->add(s1); 
coll->add(s2); 

coll->printString(); 

return 0; 

} 
+1

Вы пропустили это: 'std :: vector экземпляров;' Он нарезает. –

+0

BaseClass также может быть создан, поэтому 'getString' не является виртуальным –

+0

@IterAtor Это недопустимый аргумент. Существует большая разница между чистым виртуальным и виртуальным. –

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