프로그래밍
-
34. 인터페이스 상속과 구현 상속의 차이를 제대로 파악하고 구별하자.프로그래밍/Effective c++ 2016. 3. 10. 16:40
순수 가상함수를 선언한 클래스의 상속을 인터페이스 상속이라 하며, 파생 클래스에게 함수의 인터페이스만을 물려주려는 것이다. 이때 파생클래스는 이 함수를 반드시 정의 해야한다. 단순 가상함수의 목적은 파생클래스가 함수의 인터페이스 뿐만 아니라 구현까지 물려받을 수도 있게 하기 위함이다. 이때 물려받은 구현은 재정의도 가능하다. 이를 구현 상속이라 한다.비가상 함수의 선언 목적은 클래스가 함수의 인터페이스및 필수적인 구현을 반드시 물려받게 하기 위함이다.
-
33. 상속된 이름을 숨기는 것은 피하자.프로그래밍/Effective c++ 2016. 3. 10. 16:40
class Base {private: int x;public: virtual void mf1() = 0; virtual void mf1(int i = 0) ;};class Derived: public Base {public: virtual void mf1();};이와같이 선언하면, Derived클래스에서 mf1(2)를 호출해도 Derived의 mf1이라는 이름이 Base의 그것을 덮어버렸기 때문에 더이상 Derived의 범위에서 mf1(int)함수는 존재하지 않는다.이런 경우다음과 같이 해결한다. class Derived: public Base {public: using Base::mf1; virtual void mf1();}; Base클래스를 private로 상속한 경우에는 using을 쓸 수 없는데,..
-
32. public 상속 모형은 반드시 "is-a"를 따르도록 하자.프로그래밍/Effective c++ 2016. 3. 10. 16:40
public 상속은 is-a 관계이다. 하지만 클래스들 사이에 맺을 수 있는 관계는 has-a, is-implemented-in-terms-of도 있다.그러니 is-a 외의 관계를 is-a로 구현해서 말아먹지 마라. --> 웃기지 마라 니가 든 예제가 잘못된거 아니냐...Rectangle의 makeBigger함수를 만들었으면 virtual로 만들어서 재정의를 해야지 냅다 갖다쓰다니...영어로 is-a이면 이런 걸 해야하는 지 모르겠으나 영어에 끼워맞출려고 이런짓은 왜 하는겨... 어우 안헷갈리던게 헷갈리네 퉤퉤 ----> 다음 단원을 위한 미리 뻘짓인듯
-
-
-
-
28. 내부에서 사용하는 객체에 대한 ‘핸들’을 반환하는 코드는 되도록 피하자프로그래밍/Effective c++ 2016. 3. 10. 16:38
클래스 내부의 객체에 대한 핸들(참조자, 포인터, 반복자)를 반환하는 함수는 최대한 피하자.이 함수를 직접적으로 사용하는 경우는 상관 없으나, 다음과 같이 새로 생성한 지역 객체에 대해서 이 함수를 쓰는 순간 무효참조 핸들(댕글링 포인터)이 된다. Point& upperLeft() const { return pData ->ulhc ; } //내부 객체에 대한 핸들을 반환. const Rectangle boundingBox(const GUIObject& obj) ; //복사생성자로 객체 생성하는 함수const Point *pUpperLeft = & (boundingBox(*pgo).upperLeft()) ; //지역 객체를 생성해 포인터에 그 핸들을 대입.--> 우변의 객체는 이 문장이 끝나는 순간 사라지..
-
27. 캐스팅은 절약, 또 절약! 잊지 말자프로그래밍/Effective c++ 2016. 3. 10. 16:38
c++에는 다음과 같은 캐스팅 방식이 있다.http://www.evernote.com/l/ASkEHqK0U1lMmIqNimm3lvubOu105BONdKk/ c언어 스타일의 캐스팅을 쓰려거든 반드시 c++ 방식을 쓰자. 하지만 캐스팅은 내부 동작이 어떻게 일어날지 예상하기 힘드므로 최대한 안쓰는 다음 세가지 정도의 방향으로 설계를 하는 것이 좋다.1. B가 A를 상속한다고 할 때, B에서 A에서 상속받은 함수를 재정의 할때, A의 함수를 먼저 호출 해야하는 경우가 있다.이때 다음과 같이 억지로 타입캐스팅을 하지 말고virtual void B::onResize () { static_ cast ( * this) . onResize (); --> 이렇게 쓰는 신기한놈도 있나... 생각도 못했네;;}그냥 다음처럼..