관련 링크 : http://kldp.org/node/96019 실험코드 #include #include class CBase { public: CBase() : a(0) { } public: virtual void Test(void) { for(int i = 0; i < 10; ++i) { a = i; } } void Test2(void) { for(int i = 0; i < 10; ++i) { a = i; } } protected: int a; private: CBase(const CBase& rhs); CBase operator=(const CBase& rhs); }; class CDerived : public CBase { public: virtual void Test(void) { for(int ..
가상함수 검색 결과
항목 34 에서 가상 함수의 단점을 지적한 부분이 책에는 있는데, 나 같은 경우 생략했다. ^^; 단점은 가상함수는 기본 정의도 제공되기 때문에, 제공된 기본정의를 사용하다보면, 정작 다른 작동을 해야 할 때도 재정의를 해야 한다는것을 까먹고, 기본정의를 사용하여 디버깅이 아주 힘들수 있다는 점이다. 이것을 애초에 막고자 하려면 가상 함수를 대채할 무엇인가가 필요하다는 주제로 쓰여진 항목 35 이다. 자~ 이러한 단점들이 있음에도 가상 함수를 사용 한다는것을 찜찜해 하는 영리한 사람들은 생각하기 시작했다. "대체 할 수 있는게 없을까?" 필자는 두 팔을 다 걷어, 다른 방법을 몇가지 알려 준다고, 곽용재씨께서 말씀해 주셨다. ㅋ; 하나, 비가상 인터페이스 관용구(non-virtual interface :..
부재 : virtual 의 비용은 얼마인가? 이유 1. 구현에 따라 가상 함수(virtual function)가 성능에 영향을 미치기 때문이다. 구현방법 : 구현 방법은 없으며 개념 정리된 부분을 이해 하고 있어야 한다. 개념 정리 1. 가상 함수를 사용하면 가상 테이블(virtual table)과 가상 테이블 포인터(virtual table pointer)가 생긴다. (객체의 한쪽에 vtbl 을 가르키는 vptr이 만들어 진다) 2. 구현 방법에 따라 이 vtbl은 객체의 크기와 멤버 함수가 실행될 때의 속도에 영향을 끼친다. 3. 가상함수는 인라인 효과를 얻을 수 없다. 4. 가상상속(다이아몬드 상속을 피하기 위해)을 하면, 가상 기본 클래스의 포인터도 객체에 포함되어 덩치가 커진다. 5. RTTI는..
항목 38. 계승된 부재 인자값을 재정의하지 않도록 한다. 여기서 계승된 메소드는 가상함수일때로 국한한다는 전제조건이 따른다. 부재 인자값(default argument)이란? 기본 인자값을 말한다 (void hehehe(int a = 1); 여기서 a가 기본 인자다. 사실 부재인자도 맞는 말이다.) 2008/07/16 15:06:11 추가, 영문 표기가 오히려, 한글 표기보다 직관적일 경우가 많이 있는것 같다. 이유 1. 부모클래스의 메소드에서 설정했던 기본 인자값으로 ... 자식클래스의 메소드에서 기본 인자값이 ... 자동 셋팅 되기 때문이다. 2008/07/16 15:06:11 수정 1. 부모 클래스에서 멤버 함수의 디폴트 매개변수는 정적바인딩 되기 때문에 동적 바인딩 되는 멤버 함수가 호출되더라도..
항목 36. 인터페이스 계승과 구현의 차이점을 이해해라 2008/07/09 14:14 추가 이 이야기의 전제 조건은 어떤 클래스가 부모클래스가 될때, 그 부모클래스의 멤버 함수 선언함에 있어 주의해야 할점을 설명하는 것이다. 인터페이스 계승이란? 1. 메소드의 선언(int class::hehehe(int a); 이것을 계승한다는 뜻으로, 일종의 명령어(이런 이런 함수의 선언만 말한다)만 계승하는 것 이다. 2008/07/09 14:14 추가 2판이라 그런지 단어가 3판하고 좀 차이를 본다. 인터페이스 계승이란 함수의 정의만 계승하는것을 뜻한다. 여기서의 구현이란? 이 메소드들의 내부 동작 즉 메소드 정의(이런 이런 함수의 내부 동작을 말한다.)를 말한다. 이유 1. 각각의 차이점을 모르면 효율적인 설계를..
항목 14. 베이스 클래스에서 소멸자는 가상 함수로 선언해야 한다. 2008/05/31 14:36 수정 부재 : 모든 베이스 클래스가 아닌, 다형성을 지닌 클래스에 대해선 반드시 가상소멸자를 선언해야 한다. 이유. 1. 베이스 클래스로 자식 클래스의 소멸자를 호출하기 위해서다. - 자식(유도)클래스로 동적메모리 할당 후 부모클래스의 포인터로 받아서 사용할 경우가 생긴다면 자식(유도) 클래스의 소멸자를 꼭 호출해야지만 안전한 프로그래밍이 가능해 지기 때문이다. 문제 해결 1. 베이스 클래스의 소멸자를 virtual 의 키워드를 넣어주면 된다. 주의 해야 할점 1. 소멸자의 호출 시기를 분명히 숙지하고 있어야 한다. 2. 동적메모리를 사용하는 클래스일 경우, 매우 주의깊게 써야 한다 덧붙여 1. 추상 클래스..
최근댓글