#15 [c++] Virtual 함수 오버라이딩, 추상클래스

정상준·2022년 11월 12일
0

c++

목록 보기
11/25

📝동적 바인딩

  • 특징
    • 컴파일 시점이 아닌 실행 중 기본 클래스의 포인터로 오버라이딩 한 파생 클래스의 함수를 실행
    • 기본 클래스의 함수를 Virtual로 선언
#include <iostream>
#include <string>

using namespace std;

/* 
Circle::draw() called
*/

class Shape {
public:
	void paint() {
		draw();
	}

	virtual void draw() {
		cout << "Shape::draw() called" << endl;
	}
};

class Circle : public Shape {
public:
	virtual void draw() {
		cout << "Circle::draw() called" << endl;
	}
};

int main() {
	Shape* pShape = new Circle();
	pShape->paint();
	delete pShape;
}

📝 Virtual 함수의 오버라이딩

  • 특징
    • 함수이름, 매개변수 타입, 갯수 리턴타입이 모두 일치
    • 파생클래스에서 virtual 생략 가능(상속됨)

📝 가상 소멸자

  • 가상 소멸자
    • 소멸자를 virtual 키워드로 선언
    • 소멸자 호출 시 동적 바인딩 발생(파생 클래스의 소멸자 먼저 실행)

📝 순수 가상 함수

  • 기본 클래스의 가상 함수 목적
    • 파생 클래스에서 재정의할 함수를 알려주는 역할
      • 실행할 코드를 작성할 목적이 아님
    • 기본 클래스의 가상 함수를 굳이 구현할 필요가 없음
  • 순수 가상 함수
    • pure virtual function
    • 함수의 코드가 없고 선언만 있는 가상 멤버 함수
      • 불필요한 코드 증폭 제거 가능
    • 선언 방법
class Shape{
pubic:
	virtual void draw() = 0; //순수 가상 함수 선언
    }

📝 추상 클래스

  • 특징
    • 한 개 이상의 순수 가상 함수를 가진 클래스
    • 순수 가상함수 때문에 객체 생성은 불가능 => 상속/설계를 위한 목적
    • 포인터 선언은 가능 => 동적 바인딩을 위한 활용
  • 추상 클래스의 상속
    • 추상 클래스를 단순 상속하면 자동 추상 클래스
  • 추상 클래스의 구현
    • 추상 클래스를 상속받아 순수 가상 함수를 오버라이딩
#include <iostream>

using namespace std;

/* 
정수를 2개 입력하세요>>5 3
계산된 값은8
정수를 2개 입력하세요>>5 3
계산된 값은2
*/

class Calculator {
	void input() {
		cout << "정수를 2개 입력하세요>>";
		cin >> a >> b;
	}
protected:
	int a, b;
	virtual int calc(int a, int b) = 0;
public:
	void run() {
		input();
		cout << "계산된 값은" << calc(a, b) << endl;
	}
};

class Adder :public Calculator {
protected:
	int calc(int a, int b) {
		return a + b;
	}
};

class Sub :public Calculator {
protected:
	int calc(int a, int b) {
		return a - b;
	}
};

int main() {
	Adder add;
	Sub sub;
	add.run();
	sub.run();
}

	
profile
안드로이드개발자

0개의 댓글