연재 완료/C++ Lang 예제코드 모음

8.cpp_ex_inheritance

라이피 (Lypi) 2019. 4. 8. 11:03
반응형
header.h
#pragma once

#include 
#include 

using std::cout;
using std::cin;
using std::endl;
using std::string;
classA.h
#pragma once
#include "header.h"

class ClassA
{
private:
	int m_iPrivateA;

	void Aprivate() const
	{
		cout << "Aprivate" << endl;
	}


protected:
	int m_iProtectedA;

	void Aprotected() const
	{
		cout << "Aprotected" << endl;
	}

public:
	int m_iPublicA;

	void Apublic() const  
	{
		cout << "Apublic" << endl;
	}

	//접근자들
	int getPrivateInt() const
	{
		return m_iPrivateA;
	}

	int getProtected() const
	{
		return m_iProtectedA;
	}

	int getPublic() const
	{
		return m_iPublicA;
	}

	//오버라이딩용 함수

	int m_iID;

	void showID()
	{
		cout << m_iID << endl;
	}

	void overriding()
	{
		cout << "ClassA" << m_iID << "의 overriding" << endl;
	}

public:
	ClassA()
	{
		cout << "ClassA의 기본 생성자" << endl;

		m_iPrivateA = 'A' + 10000;
		m_iProtectedA = 'A' + 20000;
		m_iPublicA = 'A' + 30000;

		m_iID = 'A';
	}

	ClassA(int id)
	{
		cout << "ClassA의 생성자 ID : " << m_iID << endl;

		m_iPrivateA = 'A' + 10000;
		m_iProtectedA = 'A' + 20000;
		m_iPublicA = 'A' + 30000;

		m_iID = id;
	}

	virtual ~ClassA()
	{
		cout << "ClassA의 소멸자" << endl;
	}
};


classB.h
#pragma once
#include "ClassA.h"

class ClassB :public ClassA
{
private:
	int m_iPrivateB;

	void Bprivate() const
	{
		cout << "Bprivate" << endl;
	}


protected:
	int m_iProtectedB;

	void Bprotected() const
	{
		cout << "Bprotected" << endl;
	}

public:
	int m_iPublicB;

	void Bpublic() const
	{
		cout << "Bpublic" << endl;
	}

	//접근자들
	int getPrivateInt() const
	{
		return m_iPrivateB;
	}

	int getProtected() const
	{
		return m_iProtectedB;
	}

	int getPublic() const
	{
		return m_iPublicB;
	}

	//부모 클래스에 접근하기

	void AinB() const
	{
		cout << "AinB()에서 호출" << endl;

		cout << endl;
		cout << "A의 public 변수    : 접근 가능 "; cout <<    m_iPublicA << endl;
		cout << "A의 protected 변수 : 접근 가능 "; cout <<    m_iProtectedA << endl;
		cout << "A의 private 변수   : 접근 불가 "; cout /* << m_iPrivateA */ << endl; 
		cout << "A의 public 함수    : 접근 가능 ";            Apublic();
		cout << "A의 protected 함수 : 접근 가능 ";            Aprotected();
		cout << "A의 private 함수   : 접근 불가 ";          //Aprivate();
	
		cout << endl;
	}

	//오버라이딩용 함수

	int m_iID; //변수만 재정의 

	//void showID()
	//{
	//	cout << m_iID << endl;
	//}

	void overriding()
	{
		cout << "ClassB " << m_iID << "의 overriding" << endl;
	}

public:
	ClassB()
	{
		//A의 생성자를 지정하지 않음
		cout << "ClassB의 기본 생성자" << endl;

		m_iPrivateB = 'B' + 10000;
		m_iProtectedB = 'B' + 20000;
		m_iPublicB = 'B' + 30000;

		m_iID = 'B';
	}

	ClassB(int id)
	{
		// A의 생성자를 지정하지 않음
		cout << "ClassB의 생성자 ID : " << m_iID << endl;

		m_iPrivateB = 'B' + 10000;
		m_iProtectedB = 'B' + 20000;
		m_iPublicB = 'B' + 30000;

		m_iID = id;
	}

	ClassB(int Aid, int Bid) : ClassA(Aid)
	{
		// A의 생성자를 지정함
		cout << "ClassB의 생성자 ID : " << m_iID << endl;

		m_iPrivateB = 'B' + 10000;
		m_iProtectedB = 'B' + 20000;
		m_iPublicB = 'B' + 30000;

		m_iID = Bid;
	}

	virtual ~ClassB()
	{
		cout << "자식의 소멸자" << endl;
	}

};


classC_private.h
#pragma once
#include "ClassB.h"

class ClassC_private : private ClassB
{
public :
	void Cprivate_public() const {
		cout << endl;
		cout << "private로 상속한 클래스 내부에서 호출" << endl;
		
		cout << endl;
		cout << "A의 public     : 접근 가능 ";     Apublic();
		cout << "A의 protected  : 접근 가능 ";     Aprotected();
		cout << "A의 private    : 접근 불가 "    /*Aprivate(); */ << endl;
		cout << "B의 public     : 접근 가능 ";     Bpublic();
		cout << "B의 protected  : 접근 가능 ";     Bprotected();
		cout << "B의 private    : 접근 불가 "    /*Bprivate(); */ << endl;
	}
public:
	ClassC_private()
	{
		cout << "private 상속" << endl;
	}


	~ClassC_private()
	{
	}

};


classC_protected.h
#pragma once
#include "ClassB.h"

class ClassC_protected : protected ClassB
{
public:
	void Cprotected_public() const {
		cout << endl;
		cout << "protected로 상속한 클래스 내부에서 호출" << endl;

		cout << endl;
		cout << "A의 public     : 접근 가능 ";     Apublic();
		cout << "A의 protected  : 접근 가능 ";     Aprotected();
		cout << "A의 private    : 접근 불가 "    /*Aprivate(); */ << endl;
		cout << "B의 public     : 접근 가능 ";     Bpublic();
		cout << "B의 protected  : 접근 가능 ";     Bprotected();
		cout << "B의 private    : 접근 불가 "    /*Bprivate(); */ << endl;
	}
public:
	ClassC_protected()
	{
		cout << "protected 상속" << endl;
	}


	~ClassC_protected()
	{
	}

};


classC_public.h
#pragma once
#include "ClassB.h"

class ClassC_public : public ClassB
{
public:
	void Cpublic_public() const {
		cout << endl;
		cout << "public으로 상속한 클래스 내부에서 호출" << endl;

		cout << endl;
		cout << "A의 public     : 접근 가능 ";     Apublic();
		cout << "A의 protected  : 접근 가능 ";     Aprotected();
		cout << "A의 private    : 접근 불가 "    /*Aprivate(); */ << endl;
		cout << "B의 public     : 접근 가능 ";     Bpublic();
		cout << "B의 protected  : 접근 가능 ";     Bprotected();
		cout << "B의 private    : 접근 불가 "    /*Bprivate(); */ << endl;
	}
public:
	ClassC_public()
	{
		cout << "public 상속" << endl;
	}


	~ClassC_public()
	{
	}
};


main.cpp
#include "ClassB.h"
#include "ClassC_private.h"
#include "ClassC_protected.h"
#include "ClassC_public.h"

int main()
{
	{
		ClassA superClass;

		cout << endl;
		cout << "ClassA : superClass" << endl;

		cout << endl;
		//superClass.Aprivate();	//객체에서 private 멤버 함수 접근 불가
		//superClass.Aprotected();	//객체에서 protected 멤버 함수 접근 불가
		superClass.Apublic();		//객체에서 public 멤버 함수 접근 가능

		cout << endl;
		cout << "main()에서 ClassA의 객체로 호출" << endl;

		cout << endl;
		cout << "A의 public 변수    : 접근 가능 "; cout		<< superClass.m_iPublicA      << endl;
		cout << "A의 protected 변수 : 접근 불가 "; cout /*	<< superClass.m_iProtectedA*/ << endl;
		cout << "A의 private 변수   : 접근 불가 "; cout /*	<< superClass.m_iPrivateA */  << endl;
		cout << "A의 public 함수    : 접근 가능 ";				  superClass.Apublic();
		cout << "A의 protected 함수 : 접근 불가 " << endl;		//superClass.Aprotected();
		cout << "A의 private 함수   : 접근 불가 " << endl;		//superClass.Aprivate();

		cout << endl;
		cout << "재정의 함수 호출" << endl;

		cout << endl;
		cout << "재정의 전 멤버 변수            : "  <<			superClass.m_iID << endl;
		cout << "재정의 전 멤버 함수 showID     : ";	        superClass.showID();
		cout << "재정의 전 멤버 함수 overriding : ";			superClass.overriding();

		cout << endl;
	}

	{
		ClassB subClass;

		cout << endl;
		cout << "ClassB : subClass" << endl;

		cout << endl;
		//subClass.Aprivate();		//객체에서 부모의 private 멤버 접근 불가
		//subClass.Aprotected();	//객체에서 부모의 protected 멤버 접근 불가
		subClass.Apublic();			//객체에서 부모의 public 멤버 접근 가능

		//subClass.Bprivate();		//객체에서 private 멤버 접근 불가
		//subClass.Bprotected();	//객체에서 protected 멤버 접근 불가
		subClass.Bpublic();			//객체에서 public 멤버 접근 가능
		
		cout << endl;
		subClass.AinB();

		cout << endl;
		cout << "main()에서 ClassB의 객체로 호출" << endl;

		cout << endl;
		cout << "A의 public 변수    : 접근 가능 "; cout		<< subClass.m_iPublicA      << endl;
		cout << "A의 protected 변수 : 접근 불가 "; cout /*	<< subClass.m_iProtectedA*/ << endl;
		cout << "A의 private 변수   : 접근 불가 "; cout /*	<< subClass.m_iPrivateA */  << endl;
		cout << "A의 public 함수    : 접근 가능 ";             subClass.Apublic();
		cout << "A의 protected 함수 : 접근 불가 " << endl;   //subClass.Aprotected();
		cout << "A의 private 함수   : 접근 불가 " << endl;   //subClass.Aprivate();

		cout << endl;
		cout << "재정의 함수 호출" << endl;

		cout << endl;
		cout << "재정의 후 멤버 변수            : " <<   subClass.m_iID << endl;	// 재정의된 멤버 변수
		cout << "재정의 후 멤버 함수 showID     : ";     subClass.showID();         // 재정의된 멤버 변수가 포함되어 있지만 A의 함수가 호출된다.
		cout << "재정의 후 멤버 함수 overriding : ";     subClass.overriding();     // 재정의된 멤버 함수

		cout << endl;
	}

	{
		const ClassC_private privateClass;

		cout << endl;
		cout << "ClassC : subsubClass" << endl;

		cout << endl;
		cout << "private 상속" << endl;

		cout << endl;
		privateClass.Cprivate_public();

		cout << endl;
		cout << "private로 상속한 클래스 외부 객체에서 호출" << endl;

		cout << endl;
		cout << "A의 public    : 접근 불가 " << endl;		//privateClass.Apublic();
		cout << "A의 protected : 접근 불가 " << endl;		//privateClass.Aprotected();
		cout << "A의 private   : 접근 불가 " << endl;		//privateClass.Aprivate();
		cout << "B의 public    : 접근 불가 " << endl;		//privateClass.Bpublic();
		cout << "B의 protected : 접근 불가 " << endl;		//privateClass.Bprotected();
		cout << "B의 private   : 접근 불가 " << endl;		//privateClass.Bprivate();
		
		cout << endl;

	}

	{
		const ClassC_protected protectedClass;

		cout << endl;
		cout << "ClassC : subsubClass" << endl;

		cout << endl;
		cout << "protected 상속" << endl;

		cout << endl;
		protectedClass.Cprotected_public();

		cout << endl;
		cout << "protected로 상속한 클래스 외부 객체에서 호출" << endl;

		cout << endl;
		cout << "A의 public    : 접근 불가 " << endl;		//protectedClass.Apublic();
		cout << "A의 protected : 접근 불가 " << endl;		//protectedClass.Aprotected();
		cout << "A의 private   : 접근 불가 " << endl;		//protectedClass.Aprivate();
		cout << "B의 public    : 접근 불가 " << endl;		//protectedClass.Bpublic();
		cout << "B의 protected : 접근 불가 " << endl;		//protectedClass.Bprotected();
		cout << "B의 private   : 접근 불가 " << endl;		//protectedClass.Bprivate();

		cout << endl;

	}

	{
		const ClassC_public publicClass;
	
		cout << endl;
		cout << "ClassC : subsubClass" << endl;
		
		cout << endl;
		cout << "public 상속" << endl;

		cout << endl;
		publicClass.Cpublic_public();

		cout << endl;
		cout << "public으로 상속한 클래스 외부 객체에서 호출" << endl;

		cout << endl;
		cout << "A의 public     : 접근 가능 ";    publicClass.Apublic();
		cout << "A의 protected  : 접근 불가 "  /* publicClass.Aprotected(); */ <
반응형