2012-04-17 3 views
0

내 프로그램에는 상속 된 클래스가 많은 Base 클래스가 있습니다. 이 상속 된 객체 (또는 컨테이너)의 목록을 저장해야합니다. 이 작업을 수행 할 수있는 유일한 방법은 Base 클래스의 목록을 일부 형식 열거 형으로 사용하고 상속 된 형식으로 캐스팅하는 것입니다.상속 된 객체 목록 - C++

내 물건을 계속 던지려면 내 물건을 일부 상자에 넣으려고 할 때 무거운 처벌이되는 것 같습니다.

다른 옵션이 있습니까? 캐스팅은 나쁘지 않습니까?

도움 주셔서 감사합니다.

+4

왜 당신이 그들의 기본 유형에 캐스팅해야합니까? 아마 대신 가상 함수를 사용해야합니다. –

+0

기본 클래스에 대한 참조 만있는 동안 상속 된 메서드를 호출 할 수 있다고 생각하지 않았습니다. 기본 메서드를 호출하지 않을까요? 가상 메서드를 호출하려면 상속 된 클래스로 캐스팅해야한다고 생각했습니다. 내가 잘못? –

+1

네가 틀렸어. 기본 메서드가 "가상"이라고 표시되면 상속 된 메서드가 항상 호출됩니다. – Jem

답변

6

사용 다형성, 즉 그들이 거기 내용은 다음과 같습니다

#include <algorithm> 
#include <functional> 
#include <iostream> 
#include <list> 

using namespace std; 

class A { 
public: 
    virtual void print() { 
    cout << "This is an A object" << endl; 
    } 
}; 

class B : public A { 
public: 
    virtual void print() { 
    cout << "This is a B object" << endl; 
    } 
}; 

class C : public A { 
public: 
    virtual void print() { 
    cout << "This is a C object" << endl; 
    } 
}; 

class D : public B { 
    // empty 
}; 

int main() { 
    std::list<A*> objects; 
    objects.push_back(new A()); 
    objects.push_back(new B()); 
    objects.push_back(new C()); 
    objects.push_back(new D()); 

    for_each(objects.begin(), objects.end(), mem_fun(&A::print)); 

    return 0; 
} 

// outputs: 
// This is an A object 
// This is a B object 
// This is a C object 
// This is a B object 
+0

이 예제에는 많은 구문 오류가 있으며 작동하지 않습니다. 파생 된 인스턴스 (포인터가 아닌)를'list '으로 복사하면 기본 인스턴스로 조각납니다. – Wyzard

+0

수정 됨. 멀티 태스킹과 세심한주의를 기울이지 않았습니다. – keelerjr12

+0

필자는 필요한 include를 추가하여 실제로 컴파일 할 것입니다. 또한, 다른 독자들에게는'mem_fn'은 C++ 11이나 TR1이 필요합니다. – Wyzard

1

프로그래밍 방식으로 기본 클래스의 모든 하위 클래스 목록을 가져 오는 방법은 직접 지원되지 않습니다.

코드에서 일부 함수에 대한 호출을 통해 등록하여 각 하위 클래스를 "알린"하고 필요한 데이터를 수락/저장하는 함수를 가져와 코드에서 수행 할 수 있습니다.

그러나 기본 클래스에서 파생 클래스로 개체를 지속적으로 캐스팅하는 경우 다형성을 최대한 활용하지 못하는 것일 수 있습니다. 가상 함수를 통해