IT 프로그래밍/C++
[c++] virtual 함수
기술1
2024. 5. 28. 13:13
#include <iostream>
using namespace std;
class A
{
public:
void print() { cout << "A" << endl; }
};
class B : public A
{
public:
void print() { cout << "B" << endl; }
};
class C : public B
{
public:
void print() { cout << "C" << endl; }
};
class D : public C
{
public:
void print() { cout << "D" << endl; }
};
int main()
{
A a;
a.print();
B b;
b.print();
C c;
c.print();
D d;
d.print();
A& ref = b;
ref.print();
return 0;
}
여기서 ref.print()를 하면 A가 나옵니다. B가 나올 것 같은데 A가 나오는 것을 볼 수 있으며 c를 넣어도, d를 넣어도 똑같이 A가 나옵니다.
Virtual 사용
#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 B
{
public:
void print() { cout << "C" << endl; }
};
class D : public C
{
public:
void print() { cout << "D" << endl; }
};
int main()
{
A a;
a.print();
B b;
b.print();
C c;
c.print();
D d;
d.print();
A& ref = b;
ref.print();
return 0;
}
하지만 virtual로 넣어주면 B가 나오는 것을 볼 수 있습니다. 이렇게 작동하는구나 라는 것을 알아두시면 됩니다.
class C : public B
{
public:
virtual void print() { cout << "C" << endl; }
};
class D : public C
{
public:
virtual int print() { cout << "D" << endl; return 0; }
};
이렇게 virtual 간에 타입이 다르다면 오류가 뜨는데요. return type을 바꿔주면서 오버라이딩을 할 수가 없습니다.
컴파일러가 오버라이딩을 잡아주지 못합니다. 그래서 오버로딩으로 인식을 해서 작동을 할 수 있습니다. 그렇기 때문에 예비조치를 하기 위해서 override를 넣어주면 됩니다. override라고 해준다면 컴파일러가 오버라이드 되는 것이라고 컴파일 에러를 찾아주는 것입니다.
virtual은 스택같은 방식이 아닌 virtual 테이블을 사용하기 때문에 느립니다. 그래서 빠른 처리를 할 때는 virtual function을 사용하진 않는데요. 의외로 프로그래밍 생활을 방해할 수도 있기 때문에 이런 소프트웨어 특성도 알아두셔야 합니다.