C++ 다형성, 상속

LeemHyungJun·2024년 5월 24일
0

C++ Study

목록 보기
12/12

원본 코드:
https://github.com/GbLeem/CodingTest2024/blob/main/CPP/Inheritance/inheritance_test.cpp

함수 오버라이딩

  • 덮어쓰기라고 생각하면 편함
    • C++는 기본적으로 정적 바인딩한다.
  • 예시 코드 Bar() 함수가 overriding 된 함수이며 실행 예시를 보면 클래스 type에 따라 실행된다.

가상함수

  • 다형성의 가장 핵심이 되는 것
  • 동적 바인딩
  • 가상 테이블이 생성되며, 이는 클래스마다 하나를 가진다.
  • 예시 코드 Foo() 함수가 가상함수이며 실행 예시를 보면 실제로 가리키는 것에 따라 실행된다.

상속

  • 예시 코드 d 는 Derived 타입변수이며 Base로 부터 상속을 받았으므로, Base Class의 멤버함수 OnlyBase()를 쓸 수 있다.

예시 코드

#include <iostream>
using namespace std;

class Base
{
public:
	virtual void Foo()
	{
		printf("Base::Foo\n");
	}
	void Bar()
	{
		printf("Base::Bar\n");
	}
	void onlybase()
	{
		cout << "onlybase\n";
	}
};

class Derived : public Base
{
public:
	virtual void Foo()
	{
		printf("Derived::Foo\n");
	}
	void Bar() //Overriding
	{
		printf("Derived::Bar\n");
	}
	void OnlyDerived()
	{
		cout << "only derived\n";
	}
};

int main()
{
	Derived* d = new Derived(); //여기서 base 묵시적으로 만들어짐
	Base* b = reinterpret_cast<Base*>(d);
	Base* b2 = new Base();

	d->Foo(); //Derived::Foo
	d->Bar(); //Derived::Bar
	d->onlybase();
	d->OnlyDerived();
	cout << "\n";

	b->Foo(); //Derived::Foo	
	b->Bar(); //Base::Bar
	b->onlybase();
	cout << "\n";

	b2->Foo(); //Base::Foo
	b2->Bar(); //Base::Bar
	b2->onlybase();
}

0개의 댓글