2. 상속(Inheritance)
A 클래스가 B 클래스를 상속하게 되면, A 클래스는 B 클래스가 지니고 있는 모든
멤버를 물려받는다.
A 객체는 클래스에 선언 되어 있는 멤버 뿐만 아니라 B 클래스에 선언되어 있는
멤버도 존재하게 된다.
Class A : public
B
3. 상속을 위한 조건
IS-A 관계
HAS-A 관계(보통은 복합 관계로 이를 대신)
4. 객체 포인터 변수
객체 포인터 변수
객체의 주소 값을 저장하는 포인터 변수
해당 Person 객체 뿐만 아니라, Person을 상속하는 유도 클래스의 객체도 가리킬 수
있다.
Person * ptr;
ptr=new Person();
5. 가상함수(Virtual Function)
virtual 키워드 선언을 통해서 이뤄진다.
해당 함수를 오버라이딩 하는 함수도 가상함수가 된다.
해당 함수 호출시 포인터 변수가 실제로 가리키는 객체를 참조하여 호출 대상을
결정
6. 순수 가상함수&추상 클래스
순수 가상함수
함수의 몸체가 정의되지 않은 함수
0의 대입을 표시를 통해 알 수 있음.
추상 클래스
하나 이상의 멤버함수를 순수 가상함수로 선언한 클래스를 가리킴.
객체 생성이 불가능한 클래스라는 의미를 지닌다.
7. 다형성(Polymorphism)
프로그램 언어의 각 요소들이 다양한 자료형에 속하는 것이 허가되는 성질
int main(void)
{
First *ptr=new First();
ptr->SimpleFunc();
delete ptr;
ptr=new Second();
ptr->SimpleFunc();
delete ptr;
return 0;
}
ptr이 참조하는 객체의 자료형이 다르기
때문에 실행결과는 다르게 나옴.
8. 가상 소멸자(Virtual Destructor)
다형성을 이용해서 만든 포인터를 소멸할 시, 소멸자가 virtual로 되어 있지 않으
면 부모 클래스의 소멸자가 호출 된다.
Delete 연산자에 사용된 포인터 변수의 자료형에 상관 없이 모든 소멸자가 호출
되어야 한다.
class First{
public:
virtual ~First(){ … }
}
class Second: public First{
public:
virtual ~Second(){…}
}
class Third:public Second{
public:
virtual ~Third(){…}
}
int main(void)
{
First *ptr=new Third();
delete ptr;
}
virtual ~Third(){…}
virtual ~Second(){…}
virtual ~First(){…}
1
2
3
9. 다중상속
둘 이상의 클래스를 동시에 상속하는 것을 말한다.
class One{ public: void SimpleOne(){cout<<“One”<<endl;} };
class Two{ public : void SImpleTwo(){cout<<“Two”<<endl;} };
class Multi : public One, protected Two{
public:
void Complex(){ SimpleOne(); SimpleTwo(); }
};
int main(void){
Multi mul;
mul.Complex();
return 0;
}
One
Two
10. 다중 상속의 모호성
두 기초 클래스에 동일한 이름의 멤버가 존재하는 경우에는 문제가 발생할 수 있
다.
유도 클래스 내에서 멤버의 이름만으로 접근이 불가능하기 때문.
어느 클래스에 정의된 함수의 호출을 원하는지 명시를 통해 해결이 가능하다.
11. 가상 상속(Virtual Inheritance)
클래스의 상속 과정에서 같은 클래스가 두 번 이상 나타나 불필요한 자원이 소모
되는 것을 방지하기 위해 나온 것
같은 클래스군에서 두 번 이상 나타나는 클래스를 가상으로 지정하면 상속 구조
에서 몇 번이 나오더라도 오직 한 번만 서브 객체를 생성하게 하는 것
Base
One Two
Three
One Two
Three
Base