상속(Inheritance)의 기본 동작에 관한 코드이다.

Car 클래스를 상속한 Number 클래스는 부모와 자식 클래스의 관계이다.

Car 클래스 <-> Number 클래스의 관계에서


상위 클래스 <-> 하위 클래스

기초(base) 클래스 <-> 유도(derived) 클래스

슈퍼(super) 클래스 <-> 서브(sub) 클래스

부모 클래스 <-> 자식 클래스


 모두 같은 의미를 가지는 용어이다.

상속의 기본 형태

class A

{

//...

};


class B:public A 

{

//...

};





 자식 클래스의 객체는 부모 클래스로 부터 상속 받은 객체까지 모두 포함하고 있다. (위 그림 참조) 따라서 자식 클래스의 생성자는 부모 클래스의 멤버까지 초기화해야 한다. 이때 부모 클래스의 생성자를 호출해서 부모 클래스의 멤버를 초기화하는 것이 좋다.


Number(char *car_name, char *car_color, int car_no):Car(car_name,car_color)
    {
        license_plate_number = car_no;
    } 

부모 클래스의 생성자 호출을 명시한 예


Car 클래스를 상속 받는 Number 클래스를 통해 자동차에 대한 정보를 상속 받아 차량 번호를 추가하여 출력하는 예제

#include <iostream>
#include <cstring>
using namespace std;

class Car
{
private:
    char name[30];
    char color[20];
public:
    Car(char *car_name, char *car_color)
    {
        strcpy_s(name,car_name);
        strcpy_s(color,car_color);
    }
    void show_info();
};

void Car::show_info()
{
    cout << name << " is " << color << endl;
}

class Number : public Car
{
private:
    int license_plate_number;
public:
    Number(char *car_name, char *car_color, int car_no):Car(car_name,car_color)
    {
        license_plate_number = car_no;
    }
    void show_all()
    {
        show_info();
        cout << "License plate number is " << license_plate_number << endl;
    }
};

int main()
{
    Number car1("Sonata","white",1234);
    Number car2("Grandure","black",1000);
    car1.show_all();
    car2.show_all();

    return 0;
}


'프로그래밍 > C++' 카테고리의 다른 글

생성자 (Constructor)  (0) 2014.02.06
복사 생성자  (0) 2013.09.06
explicit 예제  (0) 2013.09.06
두 개의 Circle 클래스를 기반으로 한 Ring 클래스 생성  (0) 2013.08.22
난수 사용하기  (0) 2013.07.25
참조자와 함수의 호출관계  (0) 2013.07.24
new & delete 기본 사용법  (0) 2013.07.23

생성자도 함수의 일종이다. 따라서 오버로딩이 가능하다.

또한 매개변수에 '디폴트 값'을 설정할 수 있다.


#include <iostream>
using namespace std;

class TestClass
{
private:
    int num1;
    int num2;
public:
    /*TestClass()
    {
        num1=0;
        num2=0;
    }
    TestClass(int a)
    {
        num1=a;
        num2=0;
    }
    TestClass(int a, int b)
    {
        num1=a;
        num2=b;
    }
    */


    TestClass(int a=0, int b=0)
    {
        num1=a;
        num2=b;
    }
    

    void Show() const
    {
        cout<<num1<<" "<<num2<<endl;
    }
};

int main()
{
    TestClass test1;
    test1.Show();

    TestClass test2(100);
    test2.Show();

    TestClass test3(200,300);
    test3.Show();

    return 0;
}


위 코드에서 주석 처리 된 부분은 오버로딩을 통한 생성자이다. 그런데 여기서는 아래와 같은 생성자를 사용하였는데


TestClass(int a=0, int b=0)
    {
        num1=a;
        num2=b;
    }


이것은 매개변수의 디폴트 값을 정해준 형태이다.


이때 멤버 변수를 초기화할 때 멤버 이니셜라이저를 이용할 수 있다.


TestClass(int a=0, int b=0):num2(b)
    {
        num1=a;
       // num2=b;
    }


num2(b)의 의미는 num2=b와 같다.

'프로그래밍 > C++' 카테고리의 다른 글

상속의 이해  (0) 2014.02.06
복사 생성자  (0) 2013.09.06
explicit 예제  (0) 2013.09.06
두 개의 Circle 클래스를 기반으로 한 Ring 클래스 생성  (0) 2013.08.22
난수 사용하기  (0) 2013.07.25
참조자와 함수의 호출관계  (0) 2013.07.24
new & delete 기본 사용법  (0) 2013.07.23

/*
    AAA(const AAA& a){
        x=a.x;
        y=a.y;
    }

*/

이 부분이 복사 생성자이다.
하지만 주석 처리를 하여도 main() 함수의 AAA test2(test1);에 대한 에러가 없다. 이유는 디폴트 복사 생성자 때문이다.

디폴트 복사 생성자는 디폴트 생성자와 다르게 아무 일도 하지 않는 것은 아니다.

즉, 복사 생성자를 AAA(const AAA& a){ } 이런 형태로 선언하면 쓰레기값이 출력된다. 하지만 복사 생성자를 선언하지 않는다면 (자동으로 삽입되는) 디폴트 복사 생성자에 의해서 주석 처리를 하지 않았을 때와 같은 결과가 출력된다.

쉽게 말해서 위의 주석 처리된 코드가 디폴트 복사 생성자라고 보면 된다.



#include <iostream>
using namespace std;

class AAA
{
    int x, y;

public:
    AAA(int x1, int y1){
        x = x1;
        y = y1;
    }

/*
    AAA(const AAA& a){
        x=a.x;
        y=a.y;
    }

*/
    void show(){
        cout << x <<' '<< y << endl;
    }
};

int main(void)
{
    AAA test1(10, 20);
    AAA test2(test1);

    test1.show();
    test2.show();

    return 0;


'프로그래밍 > C++' 카테고리의 다른 글

상속의 이해  (0) 2014.02.06
생성자 (Constructor)  (0) 2014.02.06
explicit 예제  (0) 2013.09.06
두 개의 Circle 클래스를 기반으로 한 Ring 클래스 생성  (0) 2013.08.22
난수 사용하기  (0) 2013.07.25
참조자와 함수의 호출관계  (0) 2013.07.24
new & delete 기본 사용법  (0) 2013.07.23

+ Recent posts