728x90

가상 함수 (virtual function)


- 기본 클래스에 선언된 함수를 파생 클래스에서  재정의한 상속(:) 관계함수(상속 관계) 

   -> 상위에 있는 것을 무시하고 하위 것을 하위 클래스에 있는 함수을 실행하고자 할때

- 오버라이딩(overriding)이라고 함

- 상위 클래스의 멤버 함수를 무시

- 상위 클래스와 멤버 함수의 매개변수는 같아야 한다. 

- 리턴값은 상관없음.


형식

함수 앞에 virtual 이라는 이름을 붙여준다.

virtual void Print(){ cout<<"A"<<endl }


접근방법은 *포인터와 &참조자 형태로 접근하는 방법이 있다.

아래 예제를 참고 한다.


예제

#include <iostream>

using namespace std;

 

class A

{

public:

        virtual void Print() {cout <<"A"<<endl;}

};

 

class B : public A // A 상속

{

public:

void Print() { cout <<"B"<<endl; }

};


int main()

{

B ClassB;      //obj 생성


//포인터형

A * pClassA= &ClassB;     //포인터형 obj 생성

pClassA->Print();            //B 을 출력

 

//참조자형                    

A & ClassRefA=ClassB;    //참조자형 obj생성(선언과 동시에 초기화, A 클래스의 별명 B 클래스)

ClassRefA.Print();            //B 을 출력

return 0;

}





다형성( polymorphism )

- 상위 클래스의 가상 함수가 하위 클래스의 종류와 상관없이 재정의 되어 실행되는 특성 


예제

#include <iostream>

using namespace std;

 

class A

{

public:

virtual void Print(){ cout <<"A"<<endl; }

};


class B : public A

{

public:

void Print() { cout <<"B"<<endl; }

};

 

class C : public A

{

public:

void Print() { cout <<"C"<<endl; }

};


int main()

{

B ClassB;

C ClassC;


//포인터형

A * pClassA= &ClassB;

pClassA->Print();

pClassA=&ClassC;

pClassA->Print();


//참조자형

A & ClassRefA=ClassB;

ClassRefA.Print();

 

return 0;

}



가상 기본 클래스(virtual base class)

- 다중 상속에서 기본 클래스가 한번만 생성되게 하기 위한 상속

- 기본 클래스는 공유가 목적

- 상속 접근 지정자 앞에 virtual을 붙임


형식

class A {};

class B: virtual public A

};

class C: virtual public A

};

class D: public B, public C

{ };