C++ Chapter 11.7 : 상속 받은 함수를 감추기
카테고리: Cpp
태그: Cpp Programming
인프런에 있는 홍정모 교수님의 홍정모의 따라 하며 배우는 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_i이 public
으로 접근지정자가 변경된다. 따라서 이제 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() 호출은 불가능해진다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기