티스토리 뷰

가상함수

  • 클래스를 상속 받아서 쓸 때, 부모 클래스에 고치고 싶은 함수가 있을 때
  • 부모 클래스를 고치지 않고 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
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday