본문 바로가기

Language/C++

상속 II(생성)

상속을 공부를 않한건 아니지만 솔직히 상당히 대충 하고 넘어갔다.ㅡ.ㅡ;

상속의 기본 이전에 포스팅 했던거 같이 무엇인가를 물려 받는 것이다. 상속이 나온 이유는 프로그램 재 사용을 높이기 위한 방법이다.

기본적으로 상속에는 접근제어제가 총 3개가 되는데 private, public 외에 protected가 존재한다.

이는 상속된 파생 클래스에서는 접근을 허용하지만 외부 접근은 허용하지 않겠다는 의미이다.

또한 private 상속은 말이 상속이지 상속 않한다는 다름 없다-_-;; 예를 들어서...

class a
{
private:
     int a;
};
class b : public a
{
   .......
};
 로 상속을 했다고 치면 b는 a의 private 멤버인 a에 접근을 할수 없다. ㅡ_ㅡ;;

그렇다고 public으로 한다면 이는 은닉에 역시 잘못되는 개념이다.

그렇기 때문에 protected 를 사용하는 것이다. 외부에서는 접근 하지 못하나 상속 받은 파생클래스는 접근을 허용한다. (이거 생각보다 엄청나게 잘만들었자나..ㅡ.ㅡ;;;)

시간이 없기 때문에 짤막짤막하게 공부를 할것이다. ㅠㅠ

나중에 상속을 받는 프로젝트를 해보면서 개념을 확~잡으려고 한다.

또한 상속때 주의해야 할 점은 기본적으로 제공되는 함수(생성자, 소멸자, 복사생성자) 는 상속이 되지 않는다.

만일 상속을 받는 파생클래스에서 base클래스와 동일하게 객체를 초기화 하려고 하면 컴퍼일러가 종나 승질을 낸다.

이럴때는 이니셜라이져를 통해서 초기화를 시켜야 한다.

#include "iostream"

using std::cout;
using std::endl;
class base
{
protected:
    int a, b, c;
public:
    base(int,int);
    void init(int,int);
    void prn();

};
base::base(int aa,int bb)
{
    a = aa;
    b = bb;
}
void base::init(int aa, int bb)
{
    a = aa;
    b = bb;
}
void base::prn()
{
    cout<<a<<"    "<<b<<"    "<<c<<endl;
}

class add : public base
{
public:
    add(int aa,int bb);
    void sum();
};
add::add(int aa,int bb):base(aa,bb)//이니셜 라이져~
{
}
void add::sum()
{
    c = a+b;
}
class mul : public base
{
public:
    mul(int aa,int bb);
    void gob();

};
mul::mul(int aa,int bb):base(aa,bb)
{
}
void mul::gob()
{
    c = a * b;
}

void main()
{
    add x(3,5);
    mul y(2,7);
   
    x.sum();
    x.prn();
    y.gob();
    y.prn();

}

머 보면 알겠지만 파생클래스의 생성자로 넘어오는 인자들이 base 의 생성자로 각각 대입되어 초기화를 시킨다. 이때는 파생클래스의 생성자에 아무것도 기제를 않해도 된다. 그렇다고 블럭까지 않만들면 컴파일러 짜증낸다. ㅡ.ㅡ!!!