2022. 10. 17. 13:54ㆍC++/개인메모
다음과 같이 두 클래스를 작성하였다.
A클래스는 int형 변수 'number'가 존재하고 생성자에서 0으로 초기화한다.
print 가상함수는 A라는 것을 보여주고 number를 출력한다.
B클래스는 A클래스를 상속한다.
생성자에서 number를 5로 초기화한다.
print 가상함수를 오버라이딩하여 B라는 것을 보여주고 number를 출력한다.
두 클래스에 대한 코드와 출력 결과는 이렇게 나타난다.
a는 A클래스 객체다.
number는 0으로 초기화됐고 A와 number(=0)를 출력하였다.
b는 B클래스 객체다.
number는 5로 초기화됐고 B와 number(=5)를 출력하였다.
B클래스는 A의 자식 클래스이므로 B = A이다.
A 클래스의 객체 AFromB에 B 클래스의 객체를 넣을 수 있다.
이때 AFromB는 A 클래스의 객체이므로 A를 출력한다.
다만 B클래스의 객체를 할당했으므로 number는 5로 초기화되었다.
A클래스는 B의 부모 클래스이므로 A != B이다.
따라서 B 클래스의 객체 BFromA에 A클래스의 객체를 할당할 수 없다.
APointer는 A클래스의 '포인터'이다.
B클래스는 A의 자식 클래스이므로 A클래스의 포인터에 B클래스의 주소값을 할당할 수 있다.
하지만 A클래스의 포인터가 가리키는 주소값은 B클래스의 객체다.
따라서 APointer의 print 함수는 B와 5를 출력하게 된다.
※가상함수로 정의된 함수만이 실제 객체에 따라 호출하는 대상을 변경
B클래스의 '포인터'에 부모 클래스인 A클래스 객체의 주소값을 할당할 수 없다.
하지만 자식 클래스(B)에만 존재하는 변수나 함수가 있을때
자식 클래스(B)의 객체를 가르키는 부모 클래스(A)의 포인터로는 해당 변수나 함수에게 접근이 불가능하다.
부모 클래스의 포인터로 자식 클래스의 객체를 가리킬 수 있지만
부모 클래스의 포인터로 참조가 가능한 영역은 부모 클래스의 멤버 함수와 변수로 제한된다는 점에 유의하도록 해야한다.
'C++ > 개인메모' 카테고리의 다른 글
P와 NP (0) | 2022.12.22 |
---|---|
메모리의 구조 (0) | 2022.12.13 |
객체 지향 프로그래밍의 5원칙/5가지 특성 (2) | 2022.09.26 |
포인터 (0) | 2022.09.05 |
const, mutable (0) | 2022.09.01 |