2013-10-26 9 views
1

Base 클래스와 Derived 클래스가 있다고 가정합니다.파생 클래스의 기본 포인터

Base *A = new Base; 

여기서 A는 기본 클래스에 대한 포인터 포인트이며, new 구조의 하나 있다는 점이다.

나는이 설명하는 방법

Base *B = new Derived; 

를 보았다? B는 Base 클래스에 대한 포인터이고 Derived 클래스는 B? 다음, 거기에 Base 클래스, 말, Virtual void f()에서 파생 된 기능이며,이 Derived 클래스에서 재정의되어 있다면

B->f() 

은 어느 버전의 함수를 호출합니다? 버전 Base 클래스 또는 Derived 클래스에서 재정의 된 버전

새로운 기능 Derivedvoid g()가 어떤 경우

B->g() 제대로이 함수를 호출하는 것입니다?

하나 더있다가,

int *a = new double; 

또는

double *a = new int; 

법적인가? 상속 DerivedBase "는이다"것을 의미하기 때문에

+0

구글은'가상이는 '가상'없는 키워드입니다 – texasbruce

+0

을 polymorphism'. 그것은 다형성 작업을합니다. – jimifiki

답변

5

첫 번째 질문은, 다음 DerivedBase의 일종이다, 그래서 Base *이 그것을 지적 할 수 있어야하는 것은 의미가 있습니다.

당신이 B->f() 전화

, 당신은 ( Derived하지 않는 사실을 다시 정의하지 않습니다) Base에 의해 정의 Derived에 의해 정의 f()의 버전이 아닌 버전을 얻을 것이다. 이것은 (참조와 함께) C++에서이 다형성 동작을 얻는 주요 방법입니다. Derived이 함수 g()를 정의하는 경우

두 번째 질문은, 하지Base의 멤버는, 당신은 단지 Base *를 통해 호출 할 수 없습니다. Base *을 통해 기능을 호출 할 때는 인터페이스에서 제공하는 기능을 Base으로 만 호출 할 수 있습니다. Basevirtual 아니었다 기능 g()를 정의 경우에, 당신은 Derived이 그것을 재정의 경우에도 그 기능이 아닌 Derived 버전의 Base 버전을 얻을 것입니다.

세 번째 질문 :

int *a = new int; 

법적,하지만 :

int *a = new double; 

intdouble도 있기 때문에 너무 분명 doubleint에서 파생되지 않고, 클래스입니다.

+0

오타가있는 경우 3- (2)는 (double * a = new int;) 입니다. 그러나 귀하의 설명에 따라 불법이라고 추정합니다. – Jay

+0

예, 올바르게 가정합니다. –

3

What if there is a new function void g()in Derived, is B->g() going to invoke this function properly?

당신은 따라서를 호출 할 수 있습니다

//! cast to derived if b really is base of derived 
derived* d= dynamic_cast<derived*>(b); 
//! d is 0 if b is not a base of derived 
if(d) 
    d-> g(); 
관련 문제