2021. 6. 17. 17:13ㆍC++
생성자 => 부모생성자 호출->자식생성자 호출
소멸자 => 자식소멸자 호출->부모소멸자 호출
부모생성자 호출을 따로 안하면
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부분이 추가적으로 차지하는 바이트를 추가할 수 없다