생성자 => 부모생성자 호출->자식생성자 호출

소멸자 => 자식소멸자 호출->부모소멸자 호출

 

부모생성자 호출을 따로 안하면

1.부모 생성자에 매개변수가 필요없는경우 - 암시적 호출로 사용

2.부모 생성자에 매개변수가 들어가야하는경우 - 컴파일 에러

 

다형성(Polymorphism) - 여러 모습으로 변한다

 

정적 바인딩 - 무늬따라 가는것 (C++)

Cat* yourCat = new Cat(5,"Mocha"); - Cat의 멤버함수 따라감

Animal* yourCat = new Cat(5,"Mocha"); - Animal의 멤버함수 따라감

 

위의 방법이 아닌 JAVA형식으로 하고싶다면??

다형성의 핵심 - 가상(virtual) 함수

속도 정적(비 가상함수)>동적(가상함수) (실행중 어떤 함수 호출할지 정하기떄문)

 

가상함수를 위해서 가상 테이블이 생성

(가상 테이블이랑 모든 가상 멤버함수의 주소를 포함한다.)

-가상테이블은 클래스에 하나가 존재한다!!

 

객체 생성할 때, 해당 클래스의 가상 테이블 주소 함께 저장

 

virtual 키워드를 생략하면 메모리 누수의 가능성이 매우 높다

 

소멸자를 가상 소멸자로 사용(까먹으면 메모리 누수)

ex)Animal* yourCat = new Cat(5,"Mocha");  - 소멸자 = 메모리 누수, 가상 소멸자 = 해결

 

가상 소멸자는 매우 주용하니까 모든 클래스마다 할 것!!!

-속도는 느려지지만 내가 가상함수 사용을 안한다고 같이 작업하는 사람이 쓰지 않는건 아니다

->혹여나 하는 상황을 해결하기 위해서는 가상 소멸자가 필수!

 

멤버함수의 가상성은 상속된다

class animal

class cat : public animal

class jerry : public cat

 

cat* myCat = new Jerry()

생성자 - animal() cat() jerry() 순서대로 호출

delete myCat;

소멸자 - ~jerry() ~cat() ~animal() 순서대로 호출

 

animal.h에 있는 animal 클래스를 상속받는 cat.h의 cat 클래스는 #include "animal.h"를 해야한다!!

(부모 클래스를 인클루드해야함)->안하면 컴파일러가 부모 클래스의 메모리 레이아웃을 모른다

=>즉, cat부분이 추가적으로 차지하는 바이트를 추가할 수 없다

'C++' 카테고리의 다른 글

C++ 10일차  (0) 2021.06.23
C++ 9일차  (0) 2021.06.21
C++ 7일차  (0) 2021.06.13
C++ 6일차  (0) 2021.06.12
C++ 5일차  (0) 2021.06.11

+ Recent posts