2013-04-08 6 views
1

기본 파생 클래스 관계에이 의심이 있습니다.기본 파생 클래스 관계

저는 기본 클래스에서 클래스를 파생시킬 때 파생 클래스가 기본 클래스에 대한 모든 정보를 갖게된다는 것을 알고 있습니다. 하지만 기본 클래스는 파생 된 클래스에 대해 아무 것도 몰랐습니다.

그렇다면이 이유는 무엇입니까?

Base *b=new Derived(); 

하지

Derived *d=new Base();. 

과는 기본적으로 난 첫 번째 문의 필요성을 이해할 필요가? 내 말은, 파생 클래스 객체를 기본 클래스 포인터에 할당하는 용도는 무엇입니까?

참고 : 이것은 할당이 아닙니다. 나는 학습 프로그래밍의 초기 단계에있다. 그래서 기본적으로 비트와 조각을 이해해야합니다. 매우 기본적인 질문이고 이미 질문이 있으시면 무시하십시오.

+2

키워드 : 다형성. – chris

+5

인데, 왜냐하면'Derived '는'Base'이기 때문입니다. –

+0

@chris & Oli Charlesworth : 나는 고쳐 쓴다. 댓글을 삭제하면 사람들을 혼동하지 않게됩니다. – lapk

답변

2

하지만 기본 클래스에 대한 모든 정보를했을 포인터를

Derived *d=new Base(); 

파생 클래스 당신을한다 혼란 어떻게 생각 : 다음은 유효하지 않습니다. 기본 클래스는 파생 클래스에 대해 아무것도 모릅니다.

예 그렇기 때문에이 부분은 파생 된 것으로 선언되어 있으므로 Derived *d 기지에 관한 모든 것을 알아야합니다. 그러나 실제로 중요한 것은 실제로 만들어지는 것입니다. 이 경우 Base new Base();을 만들고 DerivedBase에 더 추가 할 수 있으므로 Base as Derived를 사용할 수 없습니다. 이 경우

Base *b=new Derived(); 

에서 그러나

는 파생 새로운를 createes. 그러나 우리는 Base에서 상속받은 것에 만 관심이 있습니다. 어느 쪽인가. 파생 때문에

는 기본

에 무엇인지 알고있다.

2

상속은 "is-a"관계를 정의합니다. Derived의 기본 클래스가 Base 인 경우 Derived은 -Base입니다. 환언

는 : 모든 Derived 목적이 유효하게하는하는 Base로 처리 될 수

Base* b = new Derived(); 

bDerivedBase 인스턴스의 일부를 액세스 할 수 있도록 역 참조.

BaseDerived이 아니기 때문에 다른 방법으로는 작동하지 않습니다. 당신은 당신의 자신의 질문에 대답 한

Derived* d = new Base(); // NOT VALID 
2

Derived 클래스 개체가 만들어지면 Base 클래스 생성자가 먼저 호출됩니다. Derived 클래스 개체는 Base 클래스 개체를 포함합니다. 이를 통해 Base 함수를 호출 할 수 있습니다. Base 클래스 객체는

enter image description here

Base *b=new Derived(); 

가 모든 파생 클래스의 객체를 처리하는 하나의 기능을 사용할 수있는 상황에서 유용한 Derived 클래스 객체를 포함하지 않는 반면. 동물 파생 클래스 : 당신이 기지를 할당하도록 허용되지 않은 경우

지금, 당신은 함수

void doSomethingtoTheAnimal(//take Animal here);

이 등 개, 고양이

상위 클래스를 고려 클래스 객체를 부모 참조 변수에 추가합니다. Dog, Cat 등의 기능을 별도로 만들어야합니다.

void doSomethingtoTheAnimal(Cat *b) or void doSomethingtoTheAnimal(Dog *b) 

그러나, 다형성에 당신은 당신이

Base *b1 = new Dog() 또는 Base *b2 = new Cat();

을 할 수있는 그런 void doSomethingtoTheAnimal(Base *b);를 사용하고 doSomethingtoTheAnimal(b1) 나 또한

doSomethingtoTheAnimal(b2), 기본 클래스 포인터가 가리키는 경우를 동일한 기능을 사용할 수 있습니다 파생 클래스 객체는 부모 클래스의 함수 만 호출하거나 하위 클래스의 함수를 오버라이드 할 수 있습니다. 자식 클래스에서만 정의 된 함수를 알지 못합니다.

관련 문제