오버라이딩
부모의 함수를 자식클래스가 재정의 할 수 있게 해준다.
virtual함수. 즉 가상함수를 이용하여 처리하여준다.
가상함수는 컴파일 중에 함수를 결정하지 않고 runtime 중에 결정한다.
그함수를 부르는 객체의 모습이 아닌 실제 속 모습을 보고 결정한다.
즉 부모 클래스에서 virtual로 선언된것은 부모 객체에서는 virtual 함수가 불려지고 자식 객체에서는 자식 클래스의 함수가 불려진다.
부모의 객체에서만 virtual 함수를 만들게 되면 자동적으로 자식에게도 가상함수가 생기지만 virtual 을 붙여주어 가상함수임을 표기해준다.
순수 가상함수는 부모함수에서 가상 함수의 선언만 있고 정의가 없는것으로 자식 클래스에서 반드시 재정의해 주어야한다.
순수 가상함수를 포함한 클래스는 추상클래스로 지정되며 인스턴스를 만들 수 없다.
가상함수를 상속받아 오버라이딩해준 자식 클래스가 인스턴스를 생성할 수 있다.
특히 소멸자에서는 virtual을 붙여준다.
가상함수 예제
부모포인터 = &부모객체;
부모포인터->함수();
부모포인터 = &자식객체
부모포인터->함수(); -->자식 객체가 출력되어버리니 virtual이 필요!
(부모=자식으로 사용시 문제는 없다.)
부모 헤더파일 ```
#pragma once
namespace Figure {
class CFigure
{
public:
CFigure();
CFigure(double nX, double nY, double nAngle);
virtual ~CFigure();
virtual void Draw();
private:
double m_nX;
double m_nY;
double m_nAngle;
};
}
>부모 cpp파일
#include
CFigure::~CFigure()
{
}
void CFigure::Draw()
{
cout << "Hi! I'm just figure class!" << endl;
}
void CFigure::Centering()
{
Draw();//부모의 draw가아닌 자식의 draw가 불러진다. 그이유는 draw가 overidden되었기 때문이다.
>자식 1 헤더파일
#pragma once
#include "CFigure.h"
class COval :
public CFigure
{
public:
COval();
virtual ~COval();
virtual void Draw() ;
};
>자식 1 cpp 파일
COval::COval() :CFigure(), m_nXWidth(10), m_nYWidth(10)
{
}
COval::~COval()
{
}
void COval::Draw()
{
cout << "hi am oval!" ;
}
>자식 2 헤더파일
class CRectangle :
public CFigure
{
public:
CRectangle();
virtual ~CRectangle();
virtual void Draw();
};
>자식 3 cpp 파일
CRectangle::CRectangle()
{
}
CRectangle::~CRectangle()
{
}
void CRectangle::Draw()
{
cout << "hi i am rectangle"<<endl;
}
# 다중상속
#include
using namespace std;
class 부모1 { public: void 부모func1 { cout << "부모1" << endl; } }; class 부모2 { public: void 부모func2() { cout << "부모2" << endl; } };
class 자식 : public 부모1, public 부모2 { public: void func() { 부모func1(); 부모func2(); } };
int main() { 자식 child;
자식.func();
return 0;
} ```
'언어 > CPP(cpp)' 카테고리의 다른 글
c++무한대표현하기.무한값 표현하기 (0) | 2018.11.04 |
---|---|
템플릿 (0) | 2018.02.06 |
상속 (0) | 2018.02.06 |
동적배열과 이차원 동적배열 (0) | 2018.02.06 |
const (0) | 2018.02.06 |