C++ Chapter 11.7 : 상속 받은 함수를 감추기

Date:     Updated:

카테고리:

태그:

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


chapter 11. 상속 : 상속 받은 함수를 감추기

🔔 using : 접근 지정자 바꾸기

#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)
	{}

    using Base::m_i;  // ⭐⭐
};


int main()
{
    Derived derived(7);
	derived.m_i = 1024;   // Base 에서 protected 임에도 불구하고 문제 없다.

	return 0;
}
public:
    using Base::m_i;

Derived 클래스가 Base 클래스를 상속 받으면서 m_i 멤버도 상속 받았다. 그러나 이 m_i 멤버는 protected. 자식 클래스인 Derived 클래스 안에서만 접근할 수 있고 main함수 같은 외부에선 접근이 불가하다. 이때 Derived클래스의 public: 영역에서 using Base::m_i을 명시해주면 m_ipublic으로 접근지정자가 변경된다. 따라서 이제 main 함수안에서 바로 m_i을 접근해도 문제가 없다. public으로 변경했기 때문에!

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

private:
    using Base::print;  // ⭐⭐
};

int main()
{
    Derived derived(7);
	derived.print();   // ❌에러❌

	return 0;
}

Derived클래스의 private: 영역에서 using Base::print, 이렇게 뒤에 함수 이름만을 명시해주어 함수 print()private으로 접근지정자가 변경되었다. 따라서 이제 main 함수나 Derived의 자식 클래스, 즉 Base의 손자 클래스에서 함수 print()을 호출하면 문제가 생긴다. private으로 변경했기 때문에!


🔔 delete : 상속 받은 함수 접근 막기

#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)
	{}
private:
    void print() = delete;
};

int main()
{
    Derived derived(7);
	derived.print();   // ❌에러❌
    derived.Base::print(); // 문제 없음!

	return 0;
}
private:
    void print() = delete;

Derived에서는 Base로부터 상속받은 멤버 함수 print()을 못쓰게 막는다. 이제 base.print() 호출만 가능하고 derived.print() 호출은 불가능해진다.



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

맨 위로 이동하기

댓글남기기