-
[C++]_10_상속c++ 2024. 11. 18. 16:52

#include <iostream> // 입출력을 위한 헤더 파일
using std::cout; // std::cout을 간단히 사용하기 위해 using 선언
// 클래스 A 정의: 부모 클래스
class A
{
private:
// private 멤버 함수: 외부에서 직접 접근 불가
void a1() { cout << "a1\n"; } // a1() 함수는 "a1"을 출력
void a2() { cout << "a2\n"; } // a2() 함수는 "a2"을 출력
public:
// public 멤버 함수: 외부에서 접근 가능
void b1() { cout << "b1\n"; } // b1() 함수는 "b1"을 출력
void b2() { cout << "b2\n"; } // b2() 함수는 "b2"을 출력
void b3() { cout << "b3\n"; } // b3() 함수는 "b3"을 출력
void b4() { cout << "b4\n"; } // b4() 함수는 "b4"을 출력
};
// 클래스 B 정의: A 클래스를 상속받은 파생 클래스 (자식 클래스)
class B : public A
{
// 아무 멤버도 추가하지 않았지만, A의 public 및 protected 멤버는 상속됨
// (private 멤버는 상속되지만 직접 접근할 수 없음)
};
int main()
{
A aa; // 클래스 A의 객체 생성
// aa.b1();
// 위 코드는 주석 처리되어 있어 실행되지 않음
// 주석을 해제하면 b1() 함수 호출로 "b1" 출력 가능
B bb; // 클래스 B의 객체 생성
// bb는 A의 public 멤버(b1, b2, b3, b4)를 상속받아 사용할 수 있음
// 하지만 main()에서 호출하는 부분이 없으므로 출력 없음
return 0; // 프로그램 종료
}
```
### 코드 설명
1. **클래스 A**:
- **private 멤버 함수**:
- `a1()`과 `a2()`는 `private`로 선언되어 `main()` 함수나 외부 클래스에서 접근할 수 없습니다.
- **public 멤버 함수**:
- `b1()`, `b2()`, `b3()`, `b4()`는 `public`으로 선언되어 외부에서 호출 가능합니다.
2. **클래스 B**:
- 클래스 `B`는 `public A`로 선언되어 클래스 `A`의 **public** 멤버와 **protected** 멤버를 상속받습니다.
- 하지만 `private` 멤버(`a1()` 및 `a2()`)는 직접 사용할 수 없습니다. 상속은 되지만 접근이 제한됩니다.
3. **main 함수**:
- 객체 `aa`는 클래스 `A`의 인스턴스입니다. 주석 처리된 `aa.b1();`을 활성화하면 `b1()` 함수가 호출되어 "b1"이 출력됩니다.
- 객체 `bb`는 클래스 `B`의 인스턴스입니다. 클래스 `A`의 모든 public 멤버를 사용할 수 있으나, main 함수에서는 호출하지 않아 아무 출력도 없습니다.
### 이 코드에서 알 수 있는 점
- **상속**:
- 클래스 `B`는 클래스 `A`를 상속받아 부모 클래스의 기능을 물려받습니다.
- 상속받은 `public` 멤버는 자식 클래스에서 그대로 사용할 수 있습니다.
- `private` 멤버는 상속되지만 외부에서 접근 불가능합니다.
- **접근 제어자**:
- `private`: 클래스 내부에서만 접근 가능.
- `public`: 어디서든 접근 가능.
- **주석 처리된 코드**:
- `aa.b1();` 주석을 제거하면 객체 `aa`가 `b1()`을 호출하여 "b1"이 출력됩니다.
### 실행 결과 (주석 해제 시):
```plaintext
b1
```아래는 다양한 프로그래밍 언어에서 상속의 기본적인 예제를 작성한 것입니다. 각 언어의 문법과 특징에 맞게 간단한 상속 구조를 보여줍니다.
---
### 1. **C++**
```cpp
#include <iostream>
using namespace std;
// 부모 클래스
class Animal {
public:
void eat() {
cout << "Eating...\n";
}
};
// 자식 클래스
class Dog : public Animal {
public:
void bark() {
cout << "Barking...\n";
}
};
int main() {
Dog dog;
dog.eat(); // 부모 클래스의 메서드 호출
dog.bark(); // 자식 클래스의 메서드 호출
return 0;
}
```
---
### 2. **Java**
```java
// 부모 클래스
class Animal {
void eat() {
System.out.println("Eating...");
}
}
// 자식 클래스
class Dog extends Animal {
void bark() {
System.out.println("Barking...");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 부모 클래스의 메서드 호출
dog.bark(); // 자식 클래스의 메서드 호출
}
}
```
---
### 3. **Python**
```python
# 부모 클래스
class Animal:
def eat(self):
print("Eating...")
# 자식 클래스
class Dog(Animal):
def bark(self):
print("Barking...")
# 실행
dog = Dog()
dog.eat() # 부모 클래스의 메서드 호출
dog.bark() # 자식 클래스의 메서드 호출
```
---
### 4. **C#**
```csharp
using System;
class Animal
{
public void Eat()
{
Console.WriteLine("Eating...");
}
}
class Dog : Animal
{
public void Bark()
{
Console.WriteLine("Barking...");
}
}
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Eat(); // 부모 클래스의 메서드 호출
dog.Bark(); // 자식 클래스의 메서드 호출
}
}
```
---
### 5. **JavaScript (ES6 Classes)**
```javascript
// 부모 클래스
class Animal {
eat() {
console.log("Eating...");
}
}
// 자식 클래스
class Dog extends Animal {
bark() {
console.log("Barking...");
}
}
// 실행
const dog = new Dog();
dog.eat(); // 부모 클래스의 메서드 호출
dog.bark(); // 자식 클래스의 메서드 호출
```
---
### 6. **Ruby**
```ruby
# 부모 클래스
class Animal
def eat
puts "Eating..."
end
end
# 자식 클래스
class Dog < Animal
def bark
puts "Barking..."
end
end
# 실행
dog = Dog.new
dog.eat # 부모 클래스의 메서드 호출
dog.bark # 자식 클래스의 메서드 호출
```
---
### 7. **Kotlin**
```kotlin
// 부모 클래스
open class Animal {
open fun eat() {
println("Eating...")
}
}
// 자식 클래스
class Dog : Animal() {
fun bark() {
println("Barking...")
}
}
// 실행
fun main() {
val dog = Dog()
dog.eat() // 부모 클래스의 메서드 호출
dog.bark() // 자식 클래스의 메서드 호출
}
```
---
### 8. **Swift**
```swift
// 부모 클래스
class Animal {
func eat() {
print("Eating...")
}
}
// 자식 클래스
class Dog: Animal {
func bark() {
print("Barking...")
}
}
// 실행
let dog = Dog()
dog.eat() // 부모 클래스의 메서드 호출
dog.bark() // 자식 클래스의 메서드 호출
```
---
### 공통 동작:
1. 부모 클래스는 **공통 동작**(`eat`)을 정의합니다.
2. 자식 클래스는 부모의 동작을 상속받아 **추가 동작**(`bark`)을 정의합니다.
3. 결과적으로 자식 객체는 부모와 자식 클래스의 메서드 모두를 사용할 수 있습니다.


시험문제 나옴 


자식클래스 Dog 
public을 사용해도 private는 절대 상속이 안된다. 





시험에 자주 나옴 
시험에 나옴 



시험에 꼭 나옴 




















#include <iostream>
using std::cout;
using std::string;
using std::endl;
class Man {
protected:
int age;
string name;
public:
Man(int age, string name) {
this->age = age;
this->name = name;
}
void m_show() {
cout << "이름: " << name << endl;
cout << "나이: " << age << endl;
}
};
class Student : public Man {
protected:
string ban;
string hak;
public:
Student(int age, string name, string ban, string hak) : Man(age, name) {
this->ban = ban;
this->hak = hak;
}
void s_show() {
m_show();
cout << "반: " << ban << endl;
cout << "학번: " << hak << endl;
}
};
class Teacher : public Man {
protected:
string subject;
string course;
public:
Teacher(int age, string name, string subject, string course) : Man(age, name) {
this->subject = subject;
this->course = course;
}
void t_show() {
m_show();
cout << "과목: " << subject << endl;
cout << "강의명: " << course << endl;
}
};
int main()
{
Student kks(20, "김컴소", "C반", "202012000");
kks.s_show();
Teacher hsh(40, "한미소", "전산", "C++프로그래밍");
hsh.t_show(); //
return 0;
}'c++' 카테고리의 다른 글
[C++]_12_(template STL 예외처리),(콘솔 파일 입출력) (0) 2024.12.02 [C++]_11_overriding static (0) 2024.11.25 [C++]_09_(함수중첩 디폴트 인자) (0) 2024.11.11 [C++]_08_const, new (0) 2024.11.04 [C++_07_객체와 멤버, 배열, 생성자, 소멸자, this] (0) 2024.10.28