티스토리 뷰

클래스 상속

#include "stdafx.h"
#include "malloc.h"
#include "string.h"
#define SZ_ALLOC_CHAR 10

class Human
{
protected:
	int age;
	char* name;
	
public:
	Human(int _age, char* _name) : age(_age)
	{
		this->name = (char *)malloc(SZ_ALLOC_CHAR);
	}
};

class Student : Human
{
private:
	int grade;
	char* school;
public:
	Student(int _age, int _grade, char* _school, char* _name) : Human(_age, _name)
	{
		this->school = (char *)malloc(SZ_ALLOC_CHAR);
	}
	void Test()
	{
		printf("%d\n", this->age); // Pass
		printf("%d\n", Human::age); // Pass
	}
};

int main()
{
	Student student(20, 1, "123", "123");
	student.Test();
	return 0;
}
학생 클래스를 만들기 전에 먼저 사람 클래스를 먼저 만들고,
사람 클래스를 부모로 하여 학생에 상속시켰다.

먼저 사람 클래스는 proctected로 age, name을 가지고 있으니, student에서 접근할 수 있고,
생성자로는 age와 name을 받아 나이를 설정하고 메모리를 할당한다.

다음으로 학생 클래스는 private로 grade, school을 가지고 있고,
생성자와 Test메소드를 가지고 있다.

1. 클래스 상속 선언
class _CHILDNAME : _PARENTNAME {}; 와 같이 사용한다.


2. 클래스 생성자 _ 부모 클래스 생성자 실행
분명 자식 클래스는 부모 클래스를 모태로 한다. 즉,
자식 클래스의 인스턴스가 생성되기 전에 부모 클래스의 인스턴스가 먼저 생성되어야 하고, 이는 부모 클래스의 생성자가 먼저 실행됨을 의미하기도 한다.

자식 클래스의 생성자에서
public:
MyClass(int arg0, int arg1) : ParentClass(arg0)
{
// do more stuff about MyClass(this - child) 
}
와 같이 부모 클래스의 ParentClass 생성자를 먼저 실행한 뒤, 자식 클래스의 생성자를 실행할 수 있다.



3. 부모 클래스 접근

부모 클래스에서 proctected또는 friend로 자식 클래스를 지정해준 경우, 부모 클래스의 메소드 또는 변수에 접근할 수 있다.

this포인터를 이용해,

this->PARENT_METHOD 와 같이 사용할 수 있으나, 이럴 경우 개발 과정에서 Intellisense가 부모 클래스와 자식 클래스 모두에 있는 변수와 메소드를 보여줄 것이기 때문에, 번거로울 수 있다.

PARENT_CLASS::METHOD_NAME와 같이 "::" 연산자를 이용해 원하는 부모 클래스의 메소드들만 나열해 접근해도 된다.




클래스 상속 / 오버라이딩

#include "stdafx.h"

class Parent
{
protected:
	void Call()
	{
		printf("System!! executed Parent::Call!!\n");
	}
};

class Child : Parent
{
public:
	bool CALL_PARENT;
	void Call()
	{
		if (CALL_PARENT) Parent::Call();
		else printf("System!! executed Child::Call!!\n");
	}

	Child() : Parent()
	{
		CALL_PARENT = true;
	}
};

int main()
{
	Child child;
	child.Call();
	child.CALL_PARENT = false;
	child.Call();
}
위 예제와 같이 상속받은 부모 클래스와 동일한 이름, 반환 형태, 인자가 동일한 메소드가 선언되어 있을 경우,
자식 클래스의 해당 메소드를 실행하면 부모 메소드는 실행되지 않는다.

이럴 경우 this로는 접근하지 못하고(본인 자식 클래스의 메소드만 참조됨.) 
위에서 언급한 것 처럼 상속받은 클래스의 이름으로 접근하여 주면 된다. (_PARENT::_METHOD)


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함