[cpp] 가상함수

Code 2008. 11. 5. 11:19

[cpp] 가상함수

 - 상속에 관련


- 모클래스에서 vitual로 선언되고 기능도 정의됨

- 자클래스에서 다시 재정의되면 자클래스의 것으로 기능이 대체됨


- virtual로 선언하지 않으면 자클래스에서  같은 이름으로 재정의를 해도 모클래스의 같은 이름의 함수가 기능을 대체


- 순수가상함수 : 정의되지 않은 가상함수

        virtual void Draw()=0;

 

 

* 오버로딩(Overloading) - 인수 목록이 다른 함수를 같은 이름으로 중복 정의

이미 있는 함수에 하나를 더 추가하는 것

중복정의

 

* 오버라이딩(Overriding) - 상속받은 멤버 함수를 재정의하는 기법

이미 있는 함수를 무시하고 새로 만드는 것

재정의

virtual

 

 

class Base{public:     void OutMessage() { printf("Base Class\n"); }};

 

class Derived : public Base{public:   void OutMessage() { printf("Derived Class\n"); }};

 

void main()

{

        Base B,*pB;    Derived D;

 

        pB=&B;

        pB->OutMessage();

        pB=&D;

        pB->OutMessage();

}

결과 =

Base Class

Base Class <- virtual로 선언해야 Derived Class가 출력됨

 

 

* 연산자 오버로딩

CString  소스 참조

선언 – operator 사용

<afx.h>

const CString& operator+=(const CString& string);

 

friend CString AFXAPI operator+(const CString& string1,     const CString& string2);

 

 

정의 일반 함수처럼 정의

<strcore.cpp>

const CString& CString::operator+=(const CString& string)

{

        ConcatInPlace(string.GetData()->nDataLength, string.m_pchData);

        return *this;

}

 

CString AFXAPI operator+(const CString& string1, const CString& string2)

{

        CString s;

        s.ConcatCopy(string1.GetData()->nDataLength, string1.m_pchData,

               string2.GetData()->nDataLength, string2.m_pchData);

        return s;

}

 

 

* friend 함수, friend 클래스

scrap from : http://cafe.naver.com/comstudy21.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=91

 

=> friend가 붙은 함수나 class는 자신의 모든 멤버를 접근 지정자와 관계없이 사용 할 수 있도록 권한을 부여

 

friend함수나 friend클래스는 상속이 불가능 하다.

 

friend함수 & 클래스는 클래스 내의 어디든 선언이 가능하다.

class A

{

     int a;

public:

     A(int _a)

 {

      a = _a;

 }

      friend class K;

      friend void fct(A a);

};

class K

{

public:

      void kk(A &a);

};

 

 

void K::kk(A &a)

{

      a.a++;

      cout<<"kk함수에서 접근한 a : "<<a.a<<endl;

}

 

 

void fct(A a)

{

      cout<<"fct함수에서 접근한 a : "<<a.a<<endl;

}

 

 

 

void main()

{

      A a(5);

      K k;

      k.kk(a);

      fct(a);

 

}

 

 


반응형
Posted by codens