2014-12-29 2 views
0

나는 처음에는 내 영어가 좋지 않다는 사과를하고 싶다. 나는 문제가있어서 무엇을해야할지 모른다. 객체 추상 클래스 웨곤에 포인터를 유지하는 벡터를 사용하고 있습니다. 이 클래스의 하위 클래스에는 왜온에 대한 정보를 추출하는 자체 정의 된 함수가 있습니다. 나는 내가 올바르게 풀 었는지 모르지만 일단 지정된 인덱스에있는 요소가 나와 벡터에서 사라지면주기를 지날 때 여기에 남아있는 것은 _vfptr뿐입니다. 그래서 다시 사이클을 타고 싶다면 지금 아무것도 목록에없는 것입니다. 나는 어떤 충고가있어서 기쁠거야. 너를 어떻게 처리 할까, 나, 너는 무언가를 요구할 수도있다. 내 부모 클래스의 Vypis() 함수는 순수 가상이며 호출 할 수 없습니다.추상적 인 클래스의 자손에 대한 벡터 접근

+3

잘못하고 있습니다! 'Vypis' 함수를'virtual'으로 만들고 자식 클래스의 올바른 메소드가 자동으로 호출됩니다. –

답변

0

가상 함수를 통해 올바른 방법을 전달할 수 있습니다. 다음 예를 보자

#include <memory> 
#include <vector> 
#include <iostream> 

class Wagon { 
public: 
    virtual ~Wagon() = default; 
    virtual void Vypis() const { 
    std::cout << "Wagon" << std::endl; 
    } 
}; 

class DinningCar 
    : public Wagon { 
    void Vypis() const { 
    std::cout << "DinningCar" << std::endl; 
    } 
}; 

class BedWagon 
    : public Wagon { 
    void Vypis() const { 
    std::cout << "BedWagon" << std::endl; 
    } 
}; 

class PassengerWagon 
    : public Wagon { 
    void Vypis() const { 
    // suppose you also want this particular wagon to call the 
    // "generic" method (that is, the one implemented by the parent 
    // class) 
    Wagon::Vypis(); 
    std::cout << "PassengerWagon" << std::endl; 
    } 
}; 

int main() { 

    std::vector<std::unique_ptr<Wagon>> wagons; 

    wagons.emplace_back(new DinningCar); 
    wagons.emplace_back(new BedWagon); 
    wagons.emplace_back(new PassengerWagon); 
    wagons.emplace_back(new DinningCar); 
    wagons.emplace_back(new Wagon); 

    for(const auto& wagon : wagons) { 
    wagon->Vypis(); 
    } 

    return 0; 
} 

컴파일 :

g++ Wagons.cpp -std=c++11 -Wall -Wextra 

및 실행

당신이 ( PassengerWagon에서와 같이) 부모의 구현을 호출할지 여부를 선택할 수있는 방법을
$ ./a.out 
DinningCar 
BedWagon 
Wagon 
PassengerWagon 
DinningCar 
Wagon 

공지 사항 또는 단지 어린이 구현; C++은 가상 함수 디스패치를 ​​내부적으로 처리합니다.

0

죄송합니다. 필자는 순수 가상 함수가있는 parrent 클래스에서 이것을 쓰는 것을 잊어 버렸습니다.
답변을 주셔서 감사합니다. 처음에는 간단히했습니다. _vagony.at (i) -> Vypis(); 하지만 그것은 내 부모 클래스의 함수 Vypis() 순수 가상이며 내가 부를 수 없기 때문에 나를 떨어 뜨린 작동하지 않았다. -

관련 문제