티스토리 뷰
가상함수
- 클래스를 상속 받아서 쓸 때, 부모 클래스에 고치고 싶은 함수가 있을 때
- 부모 클래스를 고치지 않고 virtual funtion (가상함수)를 사용하여 자식 함수를 실행하도록 함
class A
{
public:
virtual int aa(int i) { return(i * 2); }
};
class B : public A
{
public:
int aa(int i) { return(i * 3); }
};
- 가상함수는 부모 클래스 함수의 리턴값, 매개변수 개수, 형이 완전히 같아야 함
- 부모 클래스 함수 앞에 virtual을 쓰면 가상 함수가 됨
오버로딩 VS 오버라이딩
오버로딩 | 오버라이딩 | |
구현 | 함수/연산자 중첩 | 가상함수 |
바인딩 | 정적 | 동적 |
구조 | 병렬 | 상속 |
작용시점 | 컴파일시 | 실행시 |
순수가상함수
#include <iostream>
using namespace std;
class Shape { //추상클래스(abstract class)
protected:
double x, y;
public:
virtual double area()=0; //순수 가상 함수
};
순수가상함수: virtual double area( )=0; 처럼 아무 기능도 없는 함수
추상 클래스: 순수가상함수를 가진 클래스
class Rectangle : public Shape {
private:
double height, width;
public:
Rectangle(double h, double w) { height = h; width = w; }
double area() { return(width * height); }
};
class Triangle : public Shape {
private:
double height, width;
public:
Triangle(double h, double w) { height = h; width = w; }
double area() { return(width * height / 2.0); }
};
Rectangle, Triangle 클래스 모두 area( ) 함수를 가지고 있음
부모 클래스 area( ) 함수에 virtual이 있으므로 자식 클래스 함수가 실행될 것임
int main()
{
Shape* p;
Rectangle nemo(10.0, 20.0);
Triangle semo(10.0, 20.0);
p = &nemo;
cout << "네모면적:" << p->area() << endl; //Rectangle::area()
p = &semo;
cout << "세모면적:" << p->area() << endl; //Triangle::area()
return 0;
}
추상 클래스는 객체를 만들 수 없고, 포인터 객체만 만들 수 있음
자식의 주소(&~)를 부모 포인터(p)에 대입하여, 같은 p객체에서 다른 area( ) 함수를 호출할 수 있음
'C++' 카테고리의 다른 글
[C++] 9. 상속 (0) | 2021.11.23 |
---|---|
[C++] 8. 연산자 오버로딩 (0) | 2021.11.16 |
[C++] 7. 함수 오버로딩과 디폴트 매개변수 (0) | 2021.11.09 |
[C++] 5. const (0) | 2021.11.02 |
[C++] 4. 생성자와 소멸자 (0) | 2021.10.19 |
댓글