C++ 상속 받은 함수 감추기
- 프로그래밍/C/C++
- 2019. 1. 6.
C++ 상속 받은 함수 감추기
부모 클래스에서 자식 클래스 상속을 했을 때 부모 클래스에 있는 멤버 변수를 자식 클래스에서 마음대로 변경을 하고 싶으면 어떻게 해야 될 까??
부모 클래스 멤버 변수를 public 으로 선언을 한다던지 protected로 선언을 해서 자식 클래스에서 마음대로 변경을 한다던지 여러가지 방법이 있다.
#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
{
double m_d;
public:
Derived(int value) : Base(value) {}
};
int main()
{
Derived derived(7);
derived.m_i = 1024;
}
우리는 25행에서 Derived 선언을 해주고 27행처럼 사용을 하고 싶다.
그럼 어떻게 해야 될까??
20행 밑에 using Base::m_i; 라고 선언을 해주면 부모 클래스 멤벼 변수(m_i)가 Derived에서는 public으로 변환이 된다.
#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
{
double m_d;
public:
Derived(int value) : Base(value) {}
using Base::m_i;
};
int main()
{
Derived derived(7);
derived.m_i = 1024;
}
정상적으로 실행이 되는 것을 볼 수 있다.
그럼 Base 클래스에서 print 함수를 Derived에서 외부 접근을 못하게 하려면 어떻게 해야 될까?
Base 클래스에서 private으로 선언을 한다던가 뭐 기타 등등 방법이 있겠지만 다른 예를 보이겠다.
#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
{
double m_d;
using Base::print;
public:
Derived(int value) : Base(value) {}
using Base::m_i;
};
int main()
{
Derived derived(7);
derived.m_i = 1024;
derived.print();
}
19행 처럼 using Base::print; 로 선언을 해주면 main에서 접근을 못하게 한다.
다른 방법으로는
#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
{
double m_d;
//using Base::print;
void print() = delete;
public:
Derived(int value) : Base(value) {}
using Base::m_i;
};
int main()
{
Derived derived(7);
derived.m_i = 1024;
derived.print();
}
20행처럼 이렇게도 가능하다.
자식 클래스에서 print 함수를 접근 못하도록 선언은 해준것이다.