오버라이딩 핵심 개념
오버라이딩은 부모 클래스에서 정의한걸 재정의 하는 것이다. 추상클래스 (순수 가상 함수) 참조
아래와 같이 부모 클래스에선 virtual 키워드를 붙여준 뒤 함수를 정의하고 자식 클래스에서 재정의 하는 것이다. virtual로 시작 (생략 가능) 그리고 마지막엔 override 붙일 수가 있다. (이것 또한 생략 가능)
#include <iostream>
using namespace std;
class Parent
{
int mVal = 0;
public:
virtual void Fn1()
{
}
virtual void Fn2()
{
}
virtual void Fn3()
{
}
virtual void Fn4() = 0;
};
class Child : public Parent
{
public:
void Fn1()
{
cout << "Fn1" << endl;
}
virtual void Fn2()
{
cout << "Fn2" << endl;
}
void Fn3() override
{
cout << "Fn3" << endl;
}
virtual void Fn4() override
{
cout << "Fn4" << endl;
}
};
int main()
{
Child child;
child.Fn1(); child.Fn2(); child.Fn3(); child.Fn4();
return 0;
}
C#과 다르겐 접근자 영향을 받질 않는다 부모 클래스 함수 접근 불가능하고, 자식 함수에서만 접근 가능하도록 할 수도 있다.
#include <iostream>
using namespace std;
class Parent
{
int mVal = 0;
private:
virtual void Fn1()
{
}
};
class Child : public Parent
{
public:
virtual void Fn1() override
{
cout << "Fn1" << endl;
}
};
int main()
{
Child child;
child.Fn1();
return 0;
}
부모 클래스 함수 호출
Child 클래스 내 부모 함수를 호출하고자 할텐데, Print 함수 호출 시 컴파일러는 Child 클래스 내 존재하는 Print 함수 호출로 여겨 무한 루프에 빠지게 될거고 스택 오버플로우로 인해 프로그램이 종료될거다.
#include <iostream>
using namespace std;
class Parent
{
int mVal = 0;
public:
virtual void Print()
{
cout << "부모 클래스" << endl;
}
};
class Child : public Parent
{
public:
virtual void Print() override
{
cout << "자식 클래스" << endl;
Print();
}
};
int main()
{
Child child;
child.Print();
return 0;
}
아래와 같이 부모클래스명::호출할 함수 명칭으로 바꿔주면 된다.
#include <iostream>
using namespace std;
class Parent
{
int mVal = 0;
public:
virtual void Print()
{
cout << "부모 클래스" << endl;
}
};
class Child : public Parent
{
public:
virtual void Print() override
{
cout << "자식 클래스" << endl;
Parent::Print();
}
};
int main()
{
Child child;
child.Print();
return 0;
}
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 얕은 복사 깊은 복사 (Shallow/Deep Copy) (0) | 2022.07.29 |
---|---|
C++ 임시 객체 (Temporary Object) (0) | 2022.07.29 |
C++ 자기 자신 참조 (this) (0) | 2022.07.28 |
C++ 추상 클래스 / 순수 가상 함수 (Pure Virtual Function) (0) | 2022.07.28 |
C++ 클래스 접근 제한자 (Access Modifier) (0) | 2022.07.27 |