728x90
▶️ 클래스 상속
부모 클래스의 멤버를 자식클래스가 물려받아 사용할 수 있게 해주는 기능입니다
class A
{
}
// B클래스는 A클래스를 상속받음. 자식클래스가됨
class B : public A
{
}
접근자에 따라 부모의 변수와 함수에 접근이 가능/불가능 합니다
- private : 자기 자신 내부에서만 접근이 가능하고, 외부 혹은 자식 클래스 내부에서는 접근이 불가능
- protected : 자기 자신 내부 및 자식 클래스 내부에서는 접근이 가능하다. 외부에서는 접근 불가능
class A
{
public :
int mA;
int mB;
protected :
int mC;
private :
int mD;
}
class B : public A
{
public void Output()
{
mA = 100;
mB = 100;
mC = 100;
mD = 100; // 접근 불가능
}
}
▶️ 함수 재정의 ( 함수 오버라이딩 )
부모의 함수를 자식 클래스에 완전히 동일한 형태로 다시 정의하는 것으로
가상함수가 아니어도 됩니다.
class A
{
public :
void Print(){}
}
class B : public A
{
public :
// 함수 오버라이딩
void Print(){}
}
int main()
{
B* b = new B;
// 오버라이딩된 부모의 함수도 호출가능
b->A::Print();
}
▶️ 상속관계에서 생성자와 소멸자의 호출 순서
- 생성자 : 부모 -> 자식
- 소멸자 : 자식 -> 부모
class A
{
public :
A() { std::cout << "A 생성자" << std::endl; }
~A() { std::cout << "A 소멸자" << std::endl; }
}
class B : public A
{
public :
B() { std::cout << "B 생성자" << std::endl; }
~B() { std::cout << "B 소멸자" << std::endl; }
}
int main()
{
/*
A 생성자
B 생성자
B 소멸자
A 소멸자
*/
B * b = new B;
delete b;
return 0;
}
▶️ 캐스팅
RTTI(Real Time Type Infomation)가 있기 때문에 다형성이 가능합니다.
- 다형성 : 부모와 자식 사이의 형변환이 가능한 성질을 말합니다.
- 업 캐스팅 : 자식타입을 부모 타입으로 형변환
- 다운 캐스팅 : 부모타입을 자식 타입으로 형변환
class A
{
}
class B : public A
{
}
int main()
{
// new B를 해서 B타입의 메모리 크기 만큼 힙에 공간을 할당하고 그 주소를 반환.
// B포인터 타입을 A포인터 타입으로 대입해주고 있다
// == 업캐스팅
A * child = new B;
// 다운 캐스팅
B * child2 = (*B) child;
}
▶️ Dynamic_Cast
- 다운캐스팅을 할 때 잘못된 타입으로 캐스팅이 일어날 경우 nullptr을 반환하고 정상적인 형 변환일 경우 해당 메모리 주소를 반환합니다
- 업캐스팅은 안전하기 때문에 굳이 dynamic_cast를 쓸 필요가 없습니다
int main()
{
A * chlid = new B;
B* childCast = dynamic_cast<B>( child );
}
▶️ 가상함수
- 일반멤버함수 호출 :
일반 멤버함수는 함수 호출시 해당 함수 주소를 바로 호출하게 됩니다
- 가상함수 테이블 :
클래스 타입마다 만들어지게 됩니다 (객체마다 만들어지지 않습니다)
가상함수들의 메모리 주소를 저장하기 위한 배열입니다
- 가상함수 : 클래스의 멤버함수에 virtual 키워드를 붙여주면 해당 멤버함수는 가상함수가 됩니다
가상함수를 만들게 되면 가상함수 테이블이 만들어집니다.
따라서 가상함수를 호출하게 되면 일반함수처럼 바로 메모리 주소로 콜하는 것이 아니라
먼저 가상함수 테이블을 참조하여 거기에 있는 메모리 주소로 함수를 호출하게 됩니다.
- 가상함수 테이블에 저장되는 주소는
가상함수를 자식클래스에 재정의했다면 자식의 메모리 주소에 들어가게 되고
재정의가 없다면 부모 함수의 메모리 주소가 저장되어 집니다.
- vfptr(virtual function pointer) : 가상함수들의 메모리를 저장하는 포인터
728x90
'개발개발 > c++' 카테고리의 다른 글
c++의 동적배열 선언, 생성자에서 우선순위 (0) | 2024.12.17 |
---|---|
c++의 순수가상함수, 오버라이드, 다중상속, final, 생성자에서 initialize (0) | 2024.12.16 |
c++의 friend키워드, 본인 복제함수 (0) | 2024.12.12 |
c++의 클래스, 접근지정자, 생성자와 소멸자, 얕은복사(shallowCopy)와 깊은복사(DeepCopy), 메모리 단편화와 해결방안, 싱글턴패턴 (0) | 2024.12.11 |
c++의 파일 입출력 (0) | 2024.12.10 |
댓글