본문 바로가기
IT 컴퓨터_프로그램 /c++

오버라이딩_virtual

by 건축직일상 2015. 10. 13.

오버로딩 - 함수의 이름은 같은데 매개변수가 다른것 

매개변수를 통해서 함수를 식별한다


오버라이딩 - 부모클래스에 이미 정의되어있는 멤버함수를 자식클래스에서

다시 정의 해서 사용하는것 


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

댓글