본문 바로가기
반응형

virtual7

인터페이스 vs 추상 클래스 (Java, C++ 비교) C, C++ 전체 링크 인터페이스 vs 추상 클래스 (Java) 인터페이스 - 객체의 사용 방법을 정의한다. - 함수의 구현을 강제한다. - class 대신 interface 키워드 사용. - 상수와 메서드만을 가진다. 추상 클래스 - 상속을 위해 사용한다. - 추상 메서드를 가진다. - abstract 키워드 사용, new를 통해 객체 생성 불가. - abstract 메서드는 자식 클래스에서 반드시 구현해야 한다. (오버라이딩) 인터페이스와 추상 클래스 예시 청둥 오리와 모형 오리는 오리(Duck)을 상속한다. 이때 Duck은 추상 클래스다. 청둥 오리(Mallard)는 날 수 있다. 그러나 모형 오리(Model)는 날 수 없다. 따라서 fly()라는 행동은 FlyBehavior 인터페이스로 표현하고 .. 2022. 2. 5.
C++ - 순수 가상 클래스 (Pure Virtual Class) C, C++ 전체 링크 순수 가상 클래스는 순수 가상 함수를 가지는 클래스다. 순수 가상 함수는 virtual로 선언하고 끝에 = 0;이라고 표시한 함수다. 즉, 선언만 해두고 정의는 자식 클래스에 강요한다. 아래는 FOOD의 순수 가상 클래스다. #include #include using namespace std; class FOOD { public: FOOD() { cout 2021. 11. 10.
C++ - 가상 함수 테이블 (Virtual Function Table) C, C++ 전체 링크 virtual이 선언된 클래스가 있는 경우, 가상 함수 테이블은 rdata 섹션에 생성된다. 가상 함수 테이블(vtable)은 함수 포인터 배열이며, 이 포인터를 따라가면 가상 함수로 선언된 멤버 함수들의 주소에 배열 형태로 접근할 수 있다. 즉, 가상 함수 테이블이 실제 호출되어야 할 함수의 위치를 저장하고 있다. 가상 함수 테이블을 확인하기 위해 아래의 코드를 실행해보자. #include #include using namespace std; class FOOD { private: int price = 0; public: FOOD() { cout 2021. 11. 7.
C++ - virtual / override 키워드 C, C++ 전체 링크 아래의 FOOD class와 상속 받은 SNACK class를 보자. class FOOD { private: int price = 0; public: FOOD() { printf("FOOD created\n"); } ~FOOD() { printf("FOOD deleted\n"); } virtual void printName() { cout 2021. 8. 25.
C++ - 가상 소멸자 (Virtual Destructor) C, C++ 전체 링크 virtual 예시에서 사용한 코드에서 소멸자를 추가한 후, foodList의 메모리를 해제해보자. 각 class에 생성자를 추가하고 foodList[0]은 new FOOD로 수정하였다. #include #include using namespace std; class FOOD { private: int price = 0; public: FOOD() { printf("FOOD created\n"); } ~FOOD() { printf("FOOD deleted\n"); } virtual void printName() { cout 2021. 8. 23.
C++ - virtual, type casting C, C++ 전체 링크 이전 글에서 다시 virtual 키워드를 지우고, main을 아래와 같이 작성해보자. FOOD type에 MILK로 객체를 생성한 후, SNACK으로 type casting하여 printName을 호출한다. #include #include using namespace std; class FOOD { private: int price = 0; public: void printName() { cout 2021. 8. 15.
C++ - virtual 키워드 C, C++ 전체 링크 아래의 클래스를 보자. SNACK과 MILK 클래스는 FOOD 클래스를 상속한다. #include #include using namespace std; class FOOD { private: int price = 0; public: void printName() { cout printPrice(); foodList[i]->printLine(); } return 0; } 출력결과는 예상과 다르다. foodList의 원래 형태는 FOOD class지만, 실제 객체는 SNACK이나 MILK가 된다. 그러나 FOOD의 printName과 printPrice가 실행되었다. 즉, 형변환이 이루어진 포인터 변수는 원래 형태(부모)의 함수를 호출하게 된다. virtual을 이용하면 형변환이 이루.. 2021. 8. 14.
반응형