A클래스가 있고 B클래스가 있는데
B는 A를 상속받고있는상태에서
A* p = new B(); 이런식으로 업캐스팅하고
delete p;하면
A클래스 생성자호출 -> B클래스 생성자호출 -> A클래스 소멸자호출 이런식으로 되는데
자료형이 A클래스라서 A클래스를 생성하고 소멸하는건 이해함.
근데 왜 B생성자까지 부르는거야? 단순히 p가 B를 가리켜서?
그리고 B소멸자를 안부르는 이유는 A클래스로 만들었기 때문에 p는 A클래스 자료형이니까 B자체를 안만들어서 안부르는거임?
해당 댓글은 삭제되었습니다.
A생성자에 cout << "A생성자 호출" << endl> B생성자 호출순으로 되던데?
이상한 얘기를 하는거 같은데.. 제대로 호출하고 다시 테스트해봐. 일단 서브클래스 기본 생성자는 묵시적으로 수퍼클래스 기본 생성자를 호출하게 되어 있고, 서브클래스 소멸자에서 수퍼클래스 소멸자를 호출하는건 자동은 아니지만 서브클래스의 책임이므로, 서브클래스 소멸자에는 항상 수퍼클래스 소멸자 호출하는 코드를 넣어야 됨.
가리키는 녀석(=을 기준으로 왼쪽 놈)이 수퍼클래스형인지 서브클래스형인지는 아무 관계 없음.
서브클래스가 자식이고 슈퍼클래스가 부모맞지?
ㅇㅇ
virtual 붙이니까 제대로 호출하고 제대로 삭제하는데 virtual안붙이면 위처럼되는 이유가 뭐야...? 그리고 virtual안붙인 상태면 B클래스는 소멸자 호출이 안되는데 그럼 B클래스 메모리는 남아있는거야?
가상 클래스는 가상테이블이 상속관계정보를 갖고있다가 필요할때 알려줌 - dc App