객체지향 프로그래밍( C++)03

test·2022년 5월 26일
0

C++.

목록 보기
4/4

가상 함수와 오버라이딩 활용 사례

가상 함수를 가진 기본 클래스의 목적

가상 함수 오버라이딩

동적 바인딩 실행

기본 클래스의 포인터 활용

1. 가상 함수를 가진 기본 클래스의 목적

  • shape은 상속을 위한 기본 클래스로의 역할

    • 가상 함수 draw() 로 파생 클래스의 인터페이스를 보여줌.
    • shape 객체를 생성할 목적 아님.
    • Shape 객체를 생성할 목적 아님.
    • 파생 클래스에서 draw() 재정의. 자신의 도형을 그리도록 유도.

    2. 가상 함수 오버라이딩

    파생 클래스마다 다르게 구현하는 다형성.

void Circle::draw() {cout << "Circle" << endl; }
void Rect::draw() {cout <<"Rectangle" << endl; }
void Line::draw() {cout <<"Line" << endl; }

파생 클래스에서 가상 함수 draw()의 재정의.

어떤 경우에도 자신이 만든 draw()가 호출됨을 보장 받음.

  • 동적 바인딩에 의해
#include <iostream>
#include "Shape.h"
#include "Circle.h"
#include "Rect.h"
#include "Line.h"
using namespace std;

int main() {
Shape *pStart = NULL;
shape *pLast;

pStart = new Circle();
pLast = pStart;

pLast = pLast -> add(new Rect()); // 사각형 객체 생성
pLast = pLast -> add(new Circle()); // 원 객체 생성
pLast = pLast -> add(new Line()); // 선 객체 생성
pLast = pLast -> add(new Rect()); // 사각형 객체 생성

// 현재 연결된 모든 도형을 화면에 그린다.
Shape*p = pStart;
while(p != NULL) {
	p -> paint();
    p = p -> getNext();
}

// 현재 연결된 모든 도형을 삭제한다.
p = pStart;
while(p != NULL) {
	Shape* q = p -> getNext(); // 다음 도형 주소 기억.
    delete p; // 기본 클래스의 가상 소멸자 호출.
    p = q;
    }
}

main() 함수가 실행될 때 구성된 객체의 연결.

기본 클래스의 포인터 활용.

기본 클래스의 포인터로 파생 클래스 접근.

pStart, pLast, p의 타입이 Shape*

링크드 리스트를 따라 Shape를 상속받은 파생 객체들 접근.

p->paint() 의 간단한 호출로 파생 객체에 오버라이딩된 draw()함수 호출.

순수 가상 함수.

기본 클래스의 가상 함수 목적.

  • 파생 클래스에서 재정의할 함수를 알려주는 역할.

    • 실행 할 코드를 작성할 목적이 아님.
  • 기본 클래스의 가상 함수를 굳이 구현할 필요가 있나...?

    순수 가상 함수

    pure virtual function

    함수의 코드가 없고 선언만 있는 가상 멤버 함수

    선언 방법

  • 멤버 함수의 원형 =0; 으로 선언.

class Shape {
public:
	virtual void draw() = 0;
};

추상 클래스

추상 클래스 : 최소한 하나의 순수 가상 함수를 가진 클래스.

class Shape {
	Shape *next;
public:
	void paint() {
   draw();
}
virtual void draw() = 0;
};
void Shape::paint() {
	draw(); // 순수 가상 함수라도 호출은 할 수 있다.
}

추상 클래스의 특징

  • 온전한 클래스가 아니므로 객체 생성 불가능
Shape shape; // 컴파일 오류
Shape *p = new Shape(); // 컴파일 오류

추상 클래스의 포인터는 선언 가능.

Shape *p;

추상 클래스의 목적

추상 클래스의 목적

  • 추상 클래스의 인스턴스를 생성할 목적 아님.
  • 상속에서 기본 클래스의 역할을 하기 위함.
    • 순수 가상 함수를 통해 파생 클래스에서 구현할 함수의 형태(원형)을 보여주는 인터페이스 역할.
    • 추상 클래스의 모든 멤버 함수를 순수 가상 함수로 선언할 필요 없음.

추상 클래스의 상속과 구현

추상 클래스의 상속

  • 추상 클래스를 단순 상속하면 자동 추상 클래스

추상 클래스의 구현

  • 추상 클래스를 상속받아 순수 가상 함수를 오버라이딩
    • 파생 클래스는 추상 클래스가 아님

함수 중복의 약점 - 중복 함수의 코드 중복

함수 중복의 약점 - 중복 함수의 코드 중복

함수 중복의 약점 - 중복 함수의 코드 중복

일반화와 템플릿

제네릭(generic) 또는 일반화

  • 함수나 클래스를 일반화시키고, 매개 변수 타입을 지정하여 틀에서 찍어 내듯이 함수나 클래스 코드를 생산하는 기법.

템플릿

  • 함수나 클래스를 일반화하는 C++도구
  • template 키워드로 함수나 클래스 선언
    • 변수나 매개 변수의 타입만 다르고, 코드 부분이 동일한 함수를 일반화시킴.
  • 제네릭 타입 - 일반화를 위한 데이터 타입.

템플릿 선언.

템플릿으로부터의 구체화

구체화

  • 템플릿의 제네릭 타입에 구체적인 타입 지정.
    • 템플릿 함수로부터 구체화된 함수의 소스 코드 생성

제네릭 함수로부터 구체화된 함수 생성 사례.

템플릿 장점과 제네릭 프로그래밍.

profile
test

0개의 댓글