2012-02-15 2 views
1

Base 클래스 변수를 통해 파생 클래스 멤버 변수에 액세스해야합니다.기본 클래스 정적 변수를 통해 파생 클래스 멤버에 액세스해야합니다

Class A{ 

}; 

Class B:public A { 
    int data; 
}; 

는 지금이

A *pb = new B() 
pb->data = 10; 

같은 것을 할 필요가 있지만, 문제는 wihtout 그것은 내가 파생 멤버 클래스에 액세스 할 수 있습니다.

그래, 가상 기능을 사용하는 방법을 알고 있습니다.

감사합니다. 정말로 감사드립니다.

답변

1

짧은 대답 : 할 수 없습니다. 귀하의 컴파일러는 pb이 무엇인지 모르기 때문입니다. 유형은 A 일 수 있습니다. 그러나 사용할 수없는 경우 B 포인터 또는 NULL 포인터를 사용하는 dynamic_cast을 사용합니다.

A *pa = new B(); 
B *pb = dynamic_cast<B*>(pa); 
if (pb) { 
    pb->data = 10; 
} 
else { 
    ... 
} 

어쨌든, 그렇게해야하는 경우, 아마도 상영을 권장하지 않으므로 디자인을 수정해야한다는 것을 의미합니다. 때로는 피할 수없는 경우도 있습니다. 예 : 외부 라이브러리 등을 사용할 때.

2

잘못된 설계가 필요하다는 것을 나타냅니다.

하지만 실제로 나쁜 코드 작성을 주장하는 경우 B *으로 다시 캐스트 할 수 있습니다.

+0

+1하지만 캐스트가 안전하지 않다고 지정해야합니다. –

+0

그래, 사실 내 코드는 이런 상황이 아니야. 하지만 이런 식으로해야한다면 ... 궁금 해서요.하지만 어떻게 틀린 디자인을 만들었습니까? 그래서 파생 된 모든 클래스 멤버는 생성자를 통해서만 초기화/수정해야합니까? 또는 가상 함수를 통해 ??? – howtechstuffworks

+0

@howtechstuffworks는 부모로부터 파생 된 클래스 멤버에 액세스하는 것이 잘못된 것을 의미합니다. 부모는 그 자체로 실행 가능한 객체이며 순수한 가상 클래스가 아니면 파생 된 객체없이 존재할 수 있어야합니다. 올바른 방법은 부모 클래스 수준에서 정의 된 가상 함수를 사용하는 것입니다. – littleadv

2

가상 기능이 없으면 수행 할 수있는 유일한 작업은 다운 캐스팅입니다. 그것에 대해 갈 수있는 몇 가지 방법이있다 :

    는 RTTI가 활성화되어 당신이 캐스트가 성공 여부를 여부를 확인하게됩니다 상위 클래스에 적어도 하나 개의 가상 함수가있는 경우
  • 당신은 dynamic_cast는 사용할 수 있습니다 .
  • static_cast를 사용하면 상속 트리에서 아래에있는 무언가에 캐스트 할 수 있지만 성공했는지 확인할 수는 없습니다.
  • 바람을 완전히 피하고 C 스타일의 캐스트를 사용할 수도 있습니다.
+0

가상 기능이 없으면 dynamic_cast를 사용할 수 없습니다. –

+0

^의미가 있습니다 ...... 우리가 가상 변수 또는 무언가를 가지고 있으면 삶이 편해질 것 같은데 ........하지만 역동적 인 캐스트는 편리합니다 ..... 감사합니다 – howtechstuffworks

+0

좋은 수정 Luchian. 내 대답을 업데이트 할 것입니다 ... –

관련 문제