-
[c++] 순수가상함수와 추상클래스 관련 특징C++ 2023. 1. 6. 20:19
중요 1. 순수 가상함수의 구현 타이밍에 대하여
"추상클래스를 상속하는 자식클래스" 가 추상클래스가 아니게 하려면
무조건 가상함수의 몸체를 구현해주어야한다!
만약 자식클래스가 추상클래스다?
이러면 구현은 그 뒤 자식클래스에게로 넘겨주면 된다.
즉, 추상클래스가 아닌 이상 자신에게 부여된 모든 순수가상함수를 구현해주어야함!
생각해보면 매우 당연한 얘기임.
추상클래스가 아니라는 것은 직접 객체 생성할 수도 있는 클래스라는 건데
이때 함수 몸체가 0이면 당연히 에러가 쳐 날것이다.
중요 2. 추상클래스의 생성자에 대하여
추상클래스가 생성자가 필요함????
ㅇㅇ 필요함
아무리 추상클래스가 직접 생성될 일이 없다고 하더라도 생성자를 정의해주어야한다!
자식클래스 객체를 생성할때
자식클래스의 생성자가 호출되고
자식클래스의 생성자 안에서
부모클래스의 생성자들도 위로 올라가면서
쫘르르륵 호출한다
자식클래스의 생성자 내에서 첫번째 부모클래스 생성자까지 간접적으로 올라가며 다 호출되므로
그래서 맨 위의 추상클래스의 생성자도 호출되어진다
즉, 추상클래스의 생성자는 간접적으로 호출되므로 추상클래스 생성자도 정의해주어야하는거임!!
중요 3. 멤버함수의 원리
실제로 멤버변수는 클래스 내부에 존재하지만, 멤버함수는 별도의 메모리 공간에 존재한다.
그리고 해당 클래스 객체들은 이 별도의 메모리에 위치한 함수테이블을 공유한다.
즉, 멤버변수들은 객체들마다 생성되지만, 멤버함수는 객체마다 똑같은 메모리 공간을 참조하여 호출한다!
중요 4. 가상함수의 동작원리 (가상함수 테이블)
한 개 이상의 가상함수를 포함하는 클래스에 대해서는
컴파일러가 "가상함수 테이블" 이란 것을 만든다!
(virtual table로 v-table 이라고도 한다 )
이 가상함수 테이블이 만들어지는 시점은 main 함수가 호출되기 이전이다.
즉 컴파일 단계에서 객체의 생성과 상관없이 vtable을 만들고 main함수를 호출하여 프로그램을 시작하는 것이다.
가상함수 테이블은 각 클래스마다 1개씩만 만들어진다
따라서 해당 클래스 객체들은 같은 vtable을 공유하여 가상함수를 호출한다
이는 실제 호출되어야 할 함수의 위치정보를 담고 있는 테이블이다.
가상함수에는 key와 value 값이 있는데
key는 함수 이름(사실 함수구분자인데 그냥 편하게 이름이라 기억하자)
value는 해당 함수의 주소 이다.
'C++' 카테고리의 다른 글
[c++] 연산자 오버로딩 (2) (cout cin 재정의하기) (0) 2023.01.08 [c++] 연산자 오버로딩 (operator overloading) (1) (0) 2023.01.08 [c++] 순수가상함수와 추상클래스 (0) 2023.01.06 [c++] 가상함수(virtual functions) (0) 2023.01.05 [C++] 다형성 특징 (0) 2023.01.04