상속을 공부를 않한건 아니지만 솔직히 상당히 대충 하고 넘어갔다.ㅡ.ㅡ;
상속의 기본 이전에 포스팅 했던거 같이 무엇인가를 물려 받는 것이다. 상속이 나온 이유는 프로그램 재 사용을 높이기 위한 방법이다.
기본적으로 상속에는 접근제어제가 총 3개가 되는데 private, public 외에 protected가 존재한다.
이는 상속된 파생 클래스에서는 접근을 허용하지만 외부 접근은 허용하지 않겠다는 의미이다.
또한 private 상속은 말이 상속이지 상속 않한다는 다름 없다-_-;; 예를 들어서...
class a
{
private:
상속의 기본 이전에 포스팅 했던거 같이 무엇인가를 물려 받는 것이다. 상속이 나온 이유는 프로그램 재 사용을 높이기 위한 방법이다.
기본적으로 상속에는 접근제어제가 총 3개가 되는데 private, public 외에 protected가 존재한다.
이는 상속된 파생 클래스에서는 접근을 허용하지만 외부 접근은 허용하지 않겠다는 의미이다.
또한 private 상속은 말이 상속이지 상속 않한다는 다름 없다-_-;; 예를 들어서...
class a
{
private:
int a;
};
class b : public 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 의 생성자로 각각 대입되어 초기화를 시킨다. 이때는 파생클래스의 생성자에 아무것도 기제를 않해도 된다. 그렇다고 블럭까지 않만들면 컴파일러 짜증낸다. ㅡ.ㅡ!!!
로 상속을 했다고 치면 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 의 생성자로 각각 대입되어 초기화를 시킨다. 이때는 파생클래스의 생성자에 아무것도 기제를 않해도 된다. 그렇다고 블럭까지 않만들면 컴파일러 짜증낸다. ㅡ.ㅡ!!!