본문 바로가기
Language&Framework&Etc/C++

가상함수

by 머리올리자 2021. 1. 12.
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