오버라이딩

부모의 함수를 자식클래스가 재정의 할 수 있게 해준다.

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 using namespace std; namespace Figure { CFigure::CFigure() { m_nX=250; m_nY=250; m_nAngle=0; } CFigure::CFigure(double nX, double nY, double nAngle) { m_nX = nX; m_nY = nY; m_nAngle = nAngle; if (abs(nX) >= 500 || abs(nY) >= 500) { cout << "please input the value lower than 500"; exit(1); } }

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

+ Recent posts