C++ 상속 받은 함수 감추기


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 함수를 접근 못하도록 선언은 해준것이다.

댓글

Designed by JB FACTORY