c++ 상속

2023. 11. 23. 16:33C++

상속

#include <iostream>
using std::cout
;
class A // 기본 클래스, 부모 클래스 
{
private:
	void a1() {
		cout << "a1\n";
	}
	void a2() {
		cout << "a2\n";
	}
public:
	void b1() {
		cout << "b1\n";
	}
	void b2() {
		cout << "b2\n";
	}
	void b3() {
		cout << "b3\n";
	}
	void b4() {
		cout << "b4\n";
	}
};
class B :public A //class B:자식클래스 A:부모 클래스
{

};
int main()
{
	A aa; //int x
	aa.b1();
	B bb;
	bb.b2();

	return 0;		
}

public 함수 b1에 접근 a1함수는 접근 불가

class B : public A 는 A클래스의 public에 있는 함수들이 자식 클래스인 B클래스에 상속되어

bb.b2();로 함수 사용이 가능하다.

 

'상속' 개념을 사용하는 프로그래밍 언어

  1. Java: Java는 '상속'을 지원하는 대표적인 객체지향 언어입니다. 'extends' 키워드를 사용하여 상속을 구현할 수 있습니다.
  2. C++: C++에서도 '상속'을 지원합니다. ':' 연산자를 사용하여 상속을 구현할 수 있습니다.
  3. Python: Python도 상속을 지원하는 객체지향 언어입니다. 클래스 선언 시 괄호 안에 상속받을 클래스를 명시하여 상속을 구현합니다.
  4. C#: C# 역시 객체지향 프로그래밍 언어로, '상속'을 지원합니다. ':' 연산자를 사용하여 상속을 구현합니다.
  5. JavaScript: JavaScript는 프로토타입 기반의 언어로, ES6부터 'class'와 'extends'를 통한 상속을 지원합니다.

 

 

부모는 superclass 자식은 subclass이다.

상속 관계를 학문적으로 이야기 할 때는 is a관계라고 한다.

클래스 다이어그램을 그릴 때에는 자식 클래스에서 부모 클래스 쪽으로 비어있는 화살표를 그린다.

public 상속 접근인 경우에는 기본 클래스의 모든 public, protected멤버들은 파생 클래스의 public, protected 멤버가 된다.

 

 

#include <iostream>
using std::cout;
using std::endl;

class A // 기본 클래스
{
	int x;//기본 속성 private
public:
	void setX(int i) { x = i; }
	void showX() { cout << x << endl; }
};
class B:public A //파생 클래스
{
	//아무 것도 없어요. 그러나!
};
int main()
{
	A aa;
	aa.setX(1);
	aa.showX();
	B bb;
	bb.setX(10);
	bb.showX();
	return 0;
}

접근 제어 권한을 public 으로 자식 클래스 B에게 상속

 

 

접근 속성을 private으로 상속을 하게 되면 부모의 public과 protected멤버들이 자식 클래스의 private로 상속된다.

#include <iostream>
using std::cout;
using std::endl;
class A
{
	int x;
public:
	void setX(int i) { x = i; }
	void showX() { cout << x << endl; }
};
class B :private A //비공개적으로 상속받는다
{
	int y;
public:
	void setXY(int i, int j) 
	{ setX(i); y = j; }
	// 기본 클래스의 public 멤버 접근
	void showXY() { showX(); cout << y << endl; }
};
int main()
{
	B bb;
	bb.setXY(1, 2); // 파생클래스의 멤버접근
	bb.showXY(); // 파생클래스의 멤버접근
	return 0;
}

 

protected 접근제어속성:

외부에서 접근이 불가능 한 것은 private와 같지만 protected 멤버는 자식 클래스에게 상속이 가능하다.

클래스 상속에서 생성자와 소멸자 순서

생성자는 부모 클래스의 생성자부터 실행되며 소멸자는 자식 클래스의 소멸자 먼저 실행된다.

 

 

자식 클래스의 생성자에서 부모 클래스에 생성자로 값을 넘길 때는

파생클래스생성자(매개변수 리스트) :기본클래스생성자(매개변수리스트) { : }

와 같은 문법을 사용해서 부모 클래스인 A클래스의 생성자에게 값을 넘겨줘야 한다.

#include <iostream>
using std::cout;
using std::endl;
class A {
	int a;
public:
	A(int i) {
		cout << "A의 생성자\n";
		a = i;
	}
	~A() { cout << "A의 소멸자\n"; }
	void showA() { cout << a << '\n'; }
};
class B :public A {
	int b;
public:
	B(int i, int j) :A(i) {// i는 기본클래스 생성자의 매개변수로 전달
		cout << "B의 생성자\n";
		b = j;
	}
	~B() { cout << "B의 소멸자\n"; }
	void showB() { cout << b << endl; }
};
int main()
{
	B bb(10, 20);
	bb.showA();
	bb.showB();
	return 0;
}

 

'C++' 카테고리의 다른 글

C++ 템플릿  (0) 2023.12.07
C++ 상속 심화  (0) 2023.11.30
c++ 함수 중첩, 디폴트 인자  (0) 2023.11.16
C++ Const, 동적 메모리 할당  (0) 2023.11.09
C++ 클래스와 생성자, 소멸자  (0) 2023.11.02