091

[C/C++] 오버라이딩:가상함수 본문

Programming Language/C&C++

[C/C++] 오버라이딩:가상함수

공구일 2024. 12. 16. 03:31
728x90

01. 오버라이딩(Overriding) : 가상함수(Virtual function)

- 가상함수 : 부모 클래스 내에서 정의된 멤버함수를 자식 클래스에서 재정의하고자 할 때 사용, 기존의 클래스를 고치느니 상속을 받은 후, 가상함수를 이용하여 기존의 함수를 고쳐서 사용하는 방식을 채택 -> 상속 받은 함수(부모)를 실행하지 않고 자신(자식)의 함수를 실행

- 오버라이딩 : 가상함수의 구현하는 방식으로, 같은 이름의 함수를 자식 클래스에서 재정의하여 사용함, 함수의 선언 부분이 전부 같아야함

//overriding, 가상함수
class A
{
public:
virtual int SS(int i) {return(i*2);}
};
class B: public A
{
public:
int SS(int i) {return(i*3);}
};

 

- 바인딩(binding) : 변수와 함수에 대한 메모리 할당이나 함수 호출이 발생했을 때 실제로 처리해야하는 명령어들이 결정되는 시점

> 정적(static) 바인딩 ( early binding ) : 컴파일 시 변수의 위치나 함수가 실행할 명령이 결정되는 경우 (ex) static 변수, 오버로딩

#include <iostream>
using std::cout;
void sub();
int main()
{
    cout << "start\n";
    sub();
    sub();
    sub();
    return 0;
}
void sub()
{
    int x=10;
    //동적 바인딩, run-time시
    static int y=10;
    //정적 바인딩, y의 초기값은 컴파일시 10으로
    //정해지며 실행시에 이 선언문은 실행하지 않음
    cout<<x<<y<<'\n';
    x++;
    y++;
}

 

class Dog{
private:
	int age;
	static int sAge; //선언
public:
	int getAge(){return age;}
	void setAge(int a){age=a;}
};
int Dog::sAge = 3; //정의
int main() {
	Dog merry, happy;
}

 

 

- static 멤버변수는 객체들의 정보를 공유할 목적으로 사용하는 변수로, 멤버함수처럼 한 클래스에서 객체가 여러개 만들어진다고해도 정적 멤버변수는 하나만 생성됨

- 클래스는 설계도(템플릿)일 뿐으로 선언이 기억장소(메모리)에 할당되는 것이 아님 -> 정적 멤버변수는 프로그램이 시작될 때 메모리에 딱 한 번 할당되어야하는데 선언부 안에서는 메모리 할당이 이루어지지 않으니 외부에 초기화하여 메모리 할당

 

> 동적(dynamic) 바인딩 ( late binding ) : 실제 실행할 때 결정되는 경우 (ex) 지역 변수, 오버라이딩

class Parent {
public:
	virtual int SS(int i) { return i*2; }
};
class Child : public Parent {
public:
	int SS(int i) override { return i*3; }
    //자식 클래스에서 재정의
};

 

+) cast 연산자 

- (자료형)값_이나_변수 :  (int)x, (double)y

- static_cast : 컴파일 시 타입 변환 수행, 안전성 검사를 하지 않아 잘못된 타입 변환을 시도할 경우 런타임 오류 발생

- dynamic_cast : 런타임에 타입 변환 수행, if문으로 안정성 검사를 수행하여 안전하게 변환 가능

y = (int)x;
Animal* animal = static_cast<Animal*>(&dog); // 업캐스팅 (자식 -> 부모)
Dog* dog = dynamic_cast<Dog*>(animal); // 안전한 다운캐스팅

 

- 순수 가상 함수 : 추상 클래스를 정의하는데 사용되는 함수로, 기본 클래스에서 파생 클래스에서 반드시 구현해야하는 메서드를 정의 -> 추상 클래스는 완전한 클래스가 아니므로 인스턴스를 생성할 수 없음

class Shape{ //추상클래스(abstract class)
protected:
	double x,y;
public:
	// virtual double area() {return 0;} 일반 가상 함수
	virtual double area()=0; // 순수 가상 함수
};
728x90