2012-12-30 3 views
1

순수 가상 함수가있는 기본 클래스가 있고 자체 클래스뿐만 아니라 기본 클래스 가상 함수에 대한 정의가있는 파생 클래스가 있습니다.기본 클래스 객체를 가상 클래스가 아닌 파생 클래스로 호출하는 방법은 무엇입니까?

나는 자식 클래스의 메소드를 호출 할
Base *bc =new Child(); 

이 개체를 사용하는 (정의 또는 부모에 선언되지 않음) :

는 지금은 같은 클래스를 파생 할 기본 클래스 개체를 지적했다.

하지만 컴파일러 오류 memeberFunction not define in Base class이 표시됩니다.

코드는 다음과 같음 :

class Base 
{ 
public: 
    virtual void method1() = 0; 
}; 

class child : public Base 
{ 
public: 
    virtual void method1() {} 
    void Method2() { /* some implementation */ } 
}; 

내가 어떻게 이것을 달성 할 수 있습니까?

bc->Method2(); 
+2

['dynamic_cast'] (http://stackoverflow.com/questions/9973708/dynamic-cast-from-base-to-derived)를 참조하십시오. – DCoder

+1

'bc'가'Base *'이면, * 왜 * bc-> Method2();를하고 싶습니까? 여기에 근본적인 문제가 무엇입니까? – Johnsyweb

+0

어떤 유형의 Base *가 두포인지 알면, 원하는 유형으로'static_cast'를 할 수 있습니다. type_id 연산자를 사용하거나 유형 (일반적으로 열거 형 또는 정수로 ID)을 반환하는 Base에서 일종의 가상 함수를 만듭니다. –

답변

0

당신은 bcChild *에 (dynamic_cast는 사용) 캐스트, 다음 Method2()를 호출해야합니다.

2

당신이 혼자하고 싶은 사실은 나쁜 디자인 선택을 가리킨다. dynamic_cast를 사용하면 대부분의 경우 잘못된 디자인을 선택하게됩니다. 또한 dynamic_cast는 매우 느리며 가상 함수를 호출하는 것보다 훨씬 느립니다. 그런데 static_cast를 사용하여 파생 트리를 캐스팅 할 수 있습니다. 이것은 물론 매우 드문 경우입니다 (CRTP가 그 예입니다). 나는 또한이 시점에서이 객체가 "자식"이라는 것을 어떻게 알 수 있습니까? 다른 Base-Derived 객체가 아닌지 어떻게 알 수 있습니까? 그리고 당신이 정말로 알고 있다면, 처음에는 Base * 대신에 아이 *와 함께 일하는 것이 어떻습니까? Btw는 스마트 포인터 (예 : unique_ptr)를 봅니다.

0

올바른 방법은 기본 클래스에 Method2를 구현하는 것입니다. 올바른 방법으로하고 싶다면 if, buts 또는 alternatives는 없습니다. 잘못된 방법은 작동하는 dynamic_cast를 사용하는 것입니다. 그러나 여전히 올바른 일은 아닙니다.

기본적으로 기본 클래스를 변경할 수없는 경우 먼저 기본 클래스의 일부가 아닌 이유를 스스로에게 묻습니다. 클래스에서 자식 클래스에서 수행 할 수 있다고 예상되지만 어떤 이유로 든 기본 클래스에서 수행 할 수없는 경우 올바른 작업은 순수 가상으로 구현하거나 클래스를 구현하는 것입니다. 일부 적합한 "이것은 찾고있는 멤버 함수가 아닙니다"유형의 연산을 수행합니다.

0

일을하는 올바른 방법은 실제로 표현하려는 것에 달려 있습니다. 클래스 계층 구조입니다 가정 :

클래스 Kangoroo는 동물 클래스 동물과 당신 만이 동물 것을 알고 당신의 동물 포인터를 지금

를 이동할 수 있습니다. 포인터가 코끼리를 가리킬 수 있다는 것을 알기에 점프 할 수는 없습니다.

세 가지 옵션 : a) 동물 점프를하지 마십시오. 대신 캥거루 포인터를 사용하십시오. b) dynamic_cast를 사용하십시오. 이렇게하면 다음과 같이 표현할 수 있습니다. kangoroo 인 경우 점프하거나 그렇지 않으면 c) 기본 클래스 (동물)에 jump()를 추가하고 Elephant :: jump에서 예외를 throw하거나 아무 것도 수행하지 않습니다.

다른 동물도 뛰고 싶다면 b 해결책이 매우 복잡해집니다. 또한 많은 C++ 프로그래머는 dynamic_cast를 싫어합니다.

1

OOP의 원리 중 하나는 일반적인 기능 집합을 통해 다른 개체 그룹을 볼 수있는 기능입니다. 문제를 해결하기 위해 동적 또는 정적 캐스트를 사용할 수 있지만 이런 식으로하면 OOP의 가장 유용한 측면 중 하나 인 창을 버리고 있습니다.

개체에 대한 많은 캐스트를 시작하면 왼쪽부터 상속 계층 구조 (다형성)의 목적은 무엇입니까?

일반적으로 OOP는 계층 구조의 바닥에 많은 (순수한) 가상 함수를 설정할 때 잘 작동합니다. 이러한 함수 중 일부 또는 많은 함수가 일부 하위 클래스에 유용하지 않더라도 마찬가지입니다.

관련 문제