091
[C/C++] 오버라이딩:가상함수 본문
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; // 순수 가상 함수
};
'Programming Language > C&C++' 카테고리의 다른 글
[C/C++] Arduino IDE에서 ESP32를 사용하기 위한 환경설정하기 (3) | 2025.02.27 |
---|---|
[C/C++] 템플릿, STL (2) | 2024.12.16 |
[C/C++] 상속 (3) | 2024.12.15 |
[C/C++] 함수중첩(멤버함수,생성자), 디폴트 인자(매개변수) (1) | 2024.12.15 |
[C/C++] const, 동적 메모리할당(new, delete) (2) | 2024.12.15 |