C++ Chapter 11.6 : 상속 받은 함수를 오버라이딩 하기

Date:     Updated:

카테고리:

태그:

인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 C++ 강의를 듣고 정리한 필기입니다. 😀
🌜 [홍정모의 따라 하며 배우는 C++]강의 들으러 가기!


chapter 11. 상속 : 상속 받은 함수를 오버라이딩 하기

🔔 예시 1

그냥 물려받기만 했을 때

#include <iostream>

using namespace std;

class Base
{
protected:
	int m_i;

public:
	Base(int value) 
		: m_i(value)
	{ }

	void print()
	{
		cout << "I'm Base " << endl;
	}
};

class Derived : public Base
{
private:
	double m_d;

public:
	Derived(int value)
		: Base(value)
	{}

};

int main()
{
	Base base(5);
    Derived derived(7);  
	
    base.print();     // "I'm Base" 출력
	derived.print();  // ⭐ "I'm Base" 출력 ⭐
}

오버라이딩 한게 없으니 그대로 Base 클래스의 print() 내용 그대로를 상속받는다.


오버라이딩 했을 때

#include <iostream>

using namespace std;

class Base
{
protected:
	int m_i;

public:
	Base(int value) 
		: m_i(value)
	{ }

	void print()
	{
		cout << "I'm Base " << endl;
	}
};

class Derived : public Base
{
private:
	double m_d;

public:
	Derived(int value)
		: Base(value)
	{}

    void print()   // ⭐오버라이딩⭐
	{
		cout << "I'm Derived" << endl;
	}
};

int main()
{
	Base base(5);
    Derived derived(7);  
	
    base.print();     // "I'm Base" 출력
	derived.print();  // ⭐ "I'm Derived" 출력 ⭐
}

C++은 멤버를 호출하는 변수의 타입, 형이 무엇이냐에 따라 맞는 타입의 멤버를 호출 한다.

  • base.print();
    • base는 Base타입이므로 Base::print() 호출
    • “I’m Base” 출력
  • derived.print();
    • derived는 Derived타입이므로 Derived::print() 호출
    • “I’m Derived” 출력


🔔 예시 2 : 출력 연산자 오버로딩

📜Base

friend std::ostream & operator << (std::ostream & out, const Base &b)
{
    cout << "I'm Base" << endl;
    return out;
}

📜Derived

friend std::ostream & operator << (std::ostream & out, const Derived &d)
{
    cout << "I'm Derived" << endl;
    return out;
}
  • 📜Base의 출력 연산자 오버로딩을 오버라이딩 하였다.
int main()
{
    Base base;
    Derived derived;

    cout << base;    // "I'm Base" 출력
    cout << derived; // ⭐ "I'm Derived" 출력 ⭐
}

오버라이딩 하더라도 일부분은 부모 멤버 함수를 호출하고 싶다면

부모 타입으로 형변환 해주면 된다.

📜Derived

friend std::ostream & operator << (std::ostream & out, const Derived &d)
{
    cout << static_cast<Base>(d) << endl; // ⭐"I'm Base" 출력⭐
    cout << "I'm Derived" << endl; // "I'm Derived" 출력
    return out;
}
  • static_cast(b) « endl
    • Derived타입이던 dBase타입으로 형변환되어 Base의 출력 연산자 오버로딩을 호출한다.

자식 객체는 부모 객체의 일정 부분 가지고 있으므로 형변환이 가능하다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Cpp 카테고리 내 다른 글 보러가기

댓글 남기기