오버로딩 - 함수의 이름은 같은데 매개변수가 다른것
매개변수를 통해서 함수를 식별한다
오버라이딩 - 부모클래스에 이미 정의되어있는 멤버함수를 자식클래스에서
다시 정의 해서 사용하는것
class A
{
public:
void Render(void)
{
cout << "ARender" << endl;
}
public:
A(void)
{
cout << "a생성자" << endl;}
virtual ~A(void)
{
cout << "a소멸자" << endl;
}
};
class B : public A
{
public:
void Render(void)
{
cout << "BRender" << endl;
}
public:
B(void){cout << "b생성자" << endl;}
~B(void)
{
cout << "b소멸자" << endl;
}
};
class C : public B
{
public:
void Render(void)
{
cout << "CRender" << endl;
}
public:
C(void){cout << "c생성자" << endl;}
~C(void)
{
cout << "c소멸자" << endl;
}
};
void main(void)
{
A* pA = new A;
pA->Render(); // a생성자, aRender ,a소멸자
B* pB = new B;
pA2->Render(); // a생성자 , b생성자 , aRender , b소멸자 ,a소멸자
B* pB = (B*)pA2;
pB->Render(); // a생성자 ,b생성자 ,bRender ,b소멸자 ,a소멸자
//bRender 를 사용하려면 이런식으로 캐스팅 해야 가능하다
}
/////////////////////////
A* pB = new B;
A* pC = new C;
pB->Render(); // aRender
pC->Render();// aRender
//부모클래스 포인터는 최후 자식객체의 주소를 저장할수있다
//하지만 A클래스 Render에 virtual 을붙이면
virtual void Render(void)
{
cout << "ARender" << endl;
}
///////////
pB->Render(); // bRender
pC->Render();// cRender
자신의 클래스 render가 호출된다
virtual 의 특성은 최후 자식클래스 까지 상속이 되는 것을 알수가있다
상속될 클래스 에서도 virtual 이라고 명시해줘야 가독성이 편하다
virtual 을통해 포인터에 맞는 함수가 아니라 실제 객체에 맞는함수가 호출이 된다
////////////////
A* pB = new B;
delete pB;
//이 코드에서는 A 생성자 B생성자 A소멸자 라고 출력되지만 B소멸자가 출력되지않는다
이때 A클래스에
virtual ~A(void)
{
cout << "a소멸자" << endl;
}
이런식으로 소멸자를 만들면 자신의 객체까지 소멸자가 출려되어서
A생성자 B생성자 B소멸자 A소멸자 순서로 정상적으로 출력 가능하다
'IT 컴퓨터_프로그램 > c++' 카테고리의 다른 글
연산자 오버로딩 (0) | 2015.10.18 |
---|---|
오버라이딩_virtual2 (0) | 2015.10.13 |
캐스팅연산 (0) | 2015.10.12 |
클래스_상속 (0) | 2015.10.12 |
깊은복사 얕은복사 (0) | 2015.10.06 |
댓글