🧐 Study/C++ & C#

05. 상속과 포함

GAMEMING 2024. 4. 11. 00:21

 

 - 상속과 포함

// - 상속 (is a kind of, is a)
// λ§κ·ΈλŒ€λ‘œ λΆ€λͺ¨ 클래슀의 λͺ¨λ“  멀버λ₯Ό λ¬Όλ € 받은 것 + μƒˆλ‘œμš΄ 멀버λ₯Ό μΆ”κ°€ κ°€λŠ₯

// νŒŒμƒ 클래슀
// class νŒŒμƒν΄λž˜μŠ€ : public: λΆ€λͺ¨ν΄λž˜μŠ€

// 닀쀑상속 쑴재

// : - 상속을 λ‚˜νƒ€λƒ„ 

// 포함 - 클래슀 내뢀에 μ™ΈλΆ€ 클래슀의 멀버가 μžˆλŠ” 상황 (has a)

class AAA{
public:
   int a=10;
public:
  output(){ };
}
class CCC{
public:
   int c=30;
   AAA p;
public:
  output(){ cout<<p.a+b<<endl;;};
}


// 상속
class A {
public:
	int a = 10;
public:
	void output() { };
};

class B : public A {
public:
	int b = 30;
public:
	void output() { cout << a << ", " << b << endl;; };
};

 

class Vehicle {
	int serial;
protected:
	int speed;
public:
	int price;
	Vehicle(int s = 0) : serial(s), speed(0), price(0){}
	void speedUp() { speed++; }
	void speedDown() { speed--; }
	void print() 
	{
		cout << "[Vehicle] serial : " << serial << ", speed :" << speed << ", price : " << price << endl;
	}
};

class Car : public Vehicle {
	int gear;
public:
	Car(int g = 0) : gear(g) {}
	void pushAccel() { speed += 5; }
	void pushBrake() { speedDown(); }
	void setGear(int g) { gear = g; }
	void printCarInfo(const char* msg) {
		cout << msg << " speed :" << speed << ", price : " << price << ", gear : "<< gear << endl;
	}
};

int main()
{
	Car myCar(2), dreamCar(5);

	myCar.pushAccel();
	myCar.price = 3000;
	dreamCar.price = 10000;

	myCar.print();
	dreamCar.print();

	myCar.printCarInfo("[My Car]");
	dreamCar.printCarInfo("[Dream Car]");
}


// λ©€λ²„ν•¨μˆ˜ 쀑 μƒμ†λ˜μ§€ μ•Šμ€ ν•¨μˆ˜ -> μƒμ„±μž, λ³΅μ‚¬μƒμ„±μž, λŒ€μž… μ—°μ‚°μž, μ†Œλ©Έμž
λΆ€λͺ¨ 클래슀의 μ ‘κ·Ό μ§€μ •μž private 상속 protected 상속 public 상속
private μžμ‹μ—μ„œ 직접 μ ‘κ·Ό λΆˆκ°€
private 멀버가 됨
μžμ‹μ—μ„œ 직접 μ ‘κ·Ό λΆˆκ°€
private 멀버가 됨
μžμ‹μ—μ„œ 직접 μ ‘κ·Ό λΆˆκ°€
private 멀버가 됨
protected μžμ‹μ—μ„œ 직접 μ ‘κ·Ό κ°€λŠ₯
private 멀버가 변함
μžμ‹μ—μ„œ 직접 μ ‘κ·Ό κ°€λŠ₯
protected  λ©€λ²„
μžμ‹μ—μ„œ 직접 μ ‘κ·Ό κ°€λŠ₯
protected 멀버
public μžμ‹μ—μ„œ 직접 μ ‘κ·Ό κ°€λŠ₯
private 멀버가 변함
μžμ‹μ—μ„œ 직접 μ ‘κ·Ό κ°€λŠ₯
protected λ©€λ²„λ‘œ 변함
μžμ‹μ—μ„œ 직접 μ ‘κ·Ό κ°€λŠ₯
public λ©€λ²„

 

 

 

- μ˜€λ²„λΌμ΄λ”©(overriding)

// μ˜€λ²„λΌμ΄λ”©
// λΆ€λͺ¨μ—κ²Œ μ •μ˜λœ 멀버λ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜λŠ” 것

// 멀버 λ³€μˆ˜μ˜ μž¬μ •μ˜ X -> 객체에 λ™μΌν•œ 의미의 λ³€μˆ˜κ°€ μ—¬λŸ¬ 개 생길 수 있음

class A {
public:
	void overriding() { cout << "A 클래슀의 over ν•¨μˆ˜ 호좜!" << endl; }
};

class B : public A {
public:
	void overriding() { cout << "B 클래슀의 over ν•¨μˆ˜ 호좜!" << endl; }
};

int main()
{
	B b;
	b.overriding();
	return 0;
}

 

// μ˜€λ²„λ‘œλ”©
// - μ˜€λ²„λΌμ΄λ“œ ν•˜κ³ μž ν•˜λŠ” λ©”μ„œλ“œκ°€ μƒμœ„ ν΄λž˜μŠ€μ— 쑴재
// - λ©”μ†Œλ“œ 이름이 κ°™μ•„μ•Ό 함
// - ν”ΌλΌλ―Έν„°μ˜ μˆ˜μ™€ κ·Έ ν”ΌλΌλ―Έν„°μ˜ μžλ£Œν˜•μ΄ κ°™μ•„μ•Ό 함
// - λ¦¬ν„΄ν˜•λ„ κ°™μ•„μ•Ό 함
// - μƒμœ„ λ©”μ†Œλ“œμ™€ λ™μΌν•˜κ±°λ‚˜ λ‚΄μš©μ΄ μΆ”κ°€λ˜μ–΄μ•Ό 함


class Base {
private:
	string str;

public:
	Base(const string& _str) { str = _str; }
	void printStr() { cout << "기초클래슀: " << str << endl; }
};

class Derived : public Base {
private:
	int num;

public:
	Derived(const string& _str, int _num) : Base(_str) { num = _num; }
	void printStr() { cout << "νŒŒμƒν΄λž˜μŠ€: " << num << endl; }	// str λŒ€μ‹  num 좜λ ₯ν•˜λ„λ‘ μ˜€λ²„λΌμ΄λ”©
};

int main() {
	Base* ptr;
	Base a("base class");
	Derived b("derived class", 10);

	ptr = &a;
	ptr->printStr();
	ptr = &b;	// DerivedλŠ” Baseλ₯Ό 상속받기 λ•Œλ¬Έμ— is-a 관계. λ”°λΌμ„œ Base 객체 ν¬μΈν„°λŠ” Derived 객체λ₯Ό 가리킬 수 있음
	ptr->printStr();	// 이λ₯Ό μ—… μΊμŠ€νŒ…(νŒŒμƒ ν΄λž˜μŠ€μ—μ„œ 기반 클래슀둜 μΊμŠ€νŒ…ν•˜λŠ” 것)μ΄λΌν•œλ‹€.

	return 0;
}

// μžμ‹ ν΄λž˜μŠ€μ—μ„œ 직접 μ˜€λ²„λΌμ΄λ”© ν•  λ•Œμ˜ λ¬Έμ œμ μ€ -> 포인터
// ptr은 base 클래슀 νƒ€μž…μ˜ ν¬μΈν„°λ‘œ μ •μ˜λ˜μ–΄ μžˆλ‹€.

// ptr이 κ°€λ¦¬ν‚€λŠ” 객체λ₯Ό λ³€κ²½ν•˜λ”λΌλ„ μ»΄νŒŒμΌλŸ¬λŠ” 포인터 ptr이 κ°€λ¦¬ν‚€λŠ” λ³€μˆ˜μ˜ νƒ€μž… κΈ°μ€€μœΌλ‘œ ν•¨μˆ˜ 호좜
// 따라 μžμ‹μ΄ μ•„λ‹Œ λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ 호좜됨 -> viraual ν‚€μ›Œλ“œ μ‚¬μš©


class Base {
private:
	string str;

public:
	Base(const string& _str) { str = _str; }
	virtual void printStr() { cout << "기초클래슀: " << str << endl; }
};

class Derived : public Base {
private:
	int num;

public:
	Derived(const string& _str, int _num) : Base(_str) { num = _num; }
	virtual void printStr() override { cout << "νŒŒμƒν΄λž˜μŠ€: " << num << endl; }
	// 기초 ν΄λž˜μŠ€μ—μ„œλ§Œ virtual ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄λ„ λ˜μ§€λ§Œ, 이왕이면 νŒŒμƒ ν΄λž˜μŠ€μ—μ„œλ„ 
	// virtual ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ ν•΄λ‹Ή ν•¨μˆ˜κ°€ κ°€μƒν•¨μˆ˜μž„μ„ λͺ…ν™•ν•˜κ²Œ λ“œλŸ¬λ‚΄λŠ” 편이 μ’‹λ‹€.
	// override ν‚€μ›Œλ“œ λͺ…μ‹œν•΄ μ˜€λ²„λΌμ΄λ”© ν•¨μˆ˜λΌλŠ” 것을 μ˜λ―Έν•  수 있음
};

int main() {
	Base* ptr;
	Base a("base class");
	Derived b("derived class", 10);

	ptr = &a;
	ptr->printStr();
	ptr = &b;
	ptr->printStr();

	return 0;
}
728x90