int main(void)
{
Simple * som1 = new ....;
Simple * som2 = new ....;
}
"sim1, sim2가 가리키는 객체는 Simple 클래스, 또는 Simple 클래스를 상속하는 클래스 객체"
#include <iostream>
using namespace std;
class Base
{
public:
void BaseFunc() { cout << "Base Function" << endl; }
};
class Derived : public Base
{
public:
void DerivedFunc() { cout << "Derived Function" << endl; }
};
int main(void)
{
Base* bptr = new Derived(); // 컴파일 okay
bptr->DeriveFunc() // 컴파일 에러
}
이유
bptr이 Base형 포인터이기 때문
int main(void)
{
Base* bptr = new Derived(); // 컴파일 okay
Derived * dptr = bptr; // 컴파일 에러
}
C++ 컴파일러는 포인터 연산의 가능성 여부를 판단할 떄, 포인터의 자료형을 기준으로 판단하지, 실제 가리키는 객체의 자료형을 기준으로 판단하지 않는다.
Base* bptr = new Derived(); // 컴파일 okay
Derived 클래스는 Base 클래스의 유도 클래스이니까 Base 클래스의 포인터 변수로 Derived 객체의 참조가 가능하다.
Derived * dptr = bptr; // 컴파일 에러
다음과 같이 판단하고 컴파일에러
"bptr은 Base형 포인터니까, bptr이 가리키는 대상은 Base 객체일 수도 있음, 그럴 경우에 문장이 성립하지 않기 때문에 컴파일 에러"
int main(void)
{
Derived * dptr = new Derived(); // 컴파일 okay
Base * bptr = dptr; // 컴파일 okay
}
"dptr은 Derived 클래스의 포인터 변수니까, 이 포인터가 가리키는 객체는 분명 Base 클래스를 직접 혹은 간접적으로 상속하는 객체이다."
참고 : [윤성우 열혈 C++ 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.
'Language&Framework&Etc > C++' 카테고리의 다른 글
C++ Vector란 (0) | 2021.01.20 |
---|---|
템플릿 (0) | 2021.01.13 |
C++ 상속 예제 (0) | 2021.01.10 |
클래스의 완성(04-4) 클래스와 배열 그리고 this 포인터 (0) | 2021.01.10 |
C/C++ 내용 정리 (0) | 2021.01.09 |