-
[C++] 다형성 특징C++ 2023. 1. 4. 17:32
다형성은 매우 효율적인 도구란 것을 알았지만
부모클래스의 포인터로 자식클래스를 참조할 수 있게 만들었지만!
이에 따른 단점이 존재함 ㅇㅇ
아래 두가지 꼭 명심 ㄱㄱ
[중요 1]
바로 해당 포인터클래스에 있는 변수와 함수까지만 호출할 수 있다는 것

AAA BBB CCC 클래스가 있고
BBB : public AAA
CCC : public BBB
라고 하자
CCC > BBB > AAA 인 셈이다.
이때 AAA 포인터로 CCC 객체를 참조하면
AAA 클래스에 해당하는 변수와 함수만 참조/호출할 수 있음
CCC 객체의 변수와 함수는 참조할 수 없다!
그럼 만약 BBB 포인터로 CCC객체를 참조하면?
BBB 클래스 변수와 함수 + AAA 클래스 변수와 함수만 참조가능한 거임
C++ 컴파일러가 포인터연산의 가능성 여부를 판단할때,
포인터의 자료형을 기준으로 판단하지,
실제 가리키는 객체의 자료형을 기준으로 판단하지 않기 때문!
포인터형에 해당하는 클래스에 정의된 멤버에만 접근이 가능한 것임!!
class AAA { public : void MyFunc() { cout << "AAA func" << endl; } }; class BBB : public AAA { public: void MyFunc() { cout << "BBB func" << endl; } }; class CCC : public BBB { public: void MyFunc() { cout << "CCC func" << endl; } }; int main() { CCC* cptr = new CCC(); BBB* bptr = cptr; AAA* aptr = bptr; cptr->MyFunc(); bptr->MyFunc(); aptr->MyFunc(); return 0; }이렇게 하면

이렇게 출력된다. 이유는 잘 생각해보면 된다.
[중요 2]
범위가 더 큰놈 == 자식
범위가 더 작은놈 == 부모
라고 할때
무조건 다형성은 작은놈에서 큰놈으로"만" 된다!
작은놈에서 큰놈"만" 참조가 가능하지,
큰놈에서 작은놈을 참조할 순 없다!
만약 이런 코드면 에러다
CCC* cptr = new AAA(); AAA* aptr = new CCC(); BBB* bptr = aptr;#1번째꺼
CCC 포인터로 AAA를 참조못한다.
CCC포인터는 선언할때
자기가 CCC 객체나 CCC 클래스를 상속하는 클래스를 참조할거라고
컴파일러가 미리 예측하는데
엥? CCC 자기 함수도 호출못하는 AAA 클래스 객체가 나왔네? 에러다
#2번째꺼
BBB포인터에 AAA포인터형을 대입한다?
BBB포인터로는 BBB와 CCC만 가능하다!
큰놈이 작은놈을 참조할 순 없다 ㅇㅇ
[중요 3]
이런 다형성은 포인터뿐만 아니라 참조자에도 적용된다!
AAA형 참조자는 AAA형 객체 또는 AAA를
직접 혹은 간접적으로 상속하는 모든 객체를 참조할 수 있다!
C++ 코드나 함수들을 보면 인자를 참조자로 받고
참조자로 리턴하는 경우가 굉장히 많다.
따라서 참조자에 다형성을 적용하는 경우에 익숙해져야함
'C++' 카테고리의 다른 글
[c++] 순수가상함수와 추상클래스 (0) 2023.01.06 [c++] 가상함수(virtual functions) (0) 2023.01.05 [C++] 다형성(polymorphism) (0) 2023.01.04 [C++] 상속(2) - 간단한 예시 (1) 2022.12.31 [C++] 상속(1) - 개념 (0) 2022.12.31