C (101) 썸네일형 리스트형 c++ 다운캐스팅 시 static cast 절대 쓰지 말자, dynamic_cast RTII를 피하라 RTII(Run time type information) static_cast는 절대 쓰지 말자. type이 같지 않은 것을 conversion 하여 프로그램이 터질 수 있다. 그나마 안전한 것이 dynamic_cast이다. dynamic_cast는 타입이 같지 않으면 nullptr을 반환한다. 코드 >> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 .. c++ class에서 object slicing 문제 발생 코드 >> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 #include class Animal { public: Animal() = default; Animal& operator=(Animal other) = delete; virtual void speak() { std::cout c++ pure virtual function, abstract class, multiple inheritance code pure virtual function은 Base 클래스 함수 = 0 과 같이 선언한다. pure virtual function이 하나라도 존재하면 그 클래스는 abstract class다. abstract class는 하위 클래스가 pure virtual function을 override 해 주지 않으면 그 클래스는 선언이 불가능하다. 유지보수 측면에서 보면 Interface가 되는 기본 Base class에는 implementation이나 member variable 선언을 해 주지 않는다. 그리고 모든 메소드를 pure virtual로 만드는 것이 유지보수 측면에서 매우 유리하다. 코드 >> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 .. C++ 클래스 상속에서의 virtual table 코드 만약에 클래스 상속 시 Virtual Table을 사용하면 클래스의 사이즈가 기존보다 늘어난다. 왜냐하면 virtual table pointer 가 클래스에 추가로 생기기 때문이다. 코드 >> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 #include #include class Animal { public: void speak() { std::cout c++ 상속 런타임에 결정되는 virtual, override, polymorphism, upcast c++에서 클래스 상속 시 virtual 함수는 runtime 시간에 결정되게 만든다. 상속받는 함수를 override 할 때는 끝에 override를 붙인다. 그리고 destructor는 runtime에 소멸 되므로 virtual 로 만들어야 한다. upcast는 상위클래스* polycat = new 하위클래스와 같은 형식인데. (downcast)는 Cat* cat = (Cat*) polycat 과 같은 형식으로 한다 업캐스트를 하면 상위 클래스로 하위 클래스들을 한번에 다룰 수 있다. 다만 virtual로 함수를 만들어 주어야 조작이 된다. 코드 >> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 .. c++ 상속 public, protected, private 완벽 정리 코드 public, protected, private 클래스 상속에 대한 완벽 정리를 기록용으로 코드로 적어 놓았다. 코드 >> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 #include class Animal { public: void .. c++ exception safety guarantee, exception 주의점, exception을 사용하지 말아야 하는 case Exception Safety guarantee에는 1. Basic Exception Safety 2. Strong Exception Safety 3. No-throw guarantee가 있다. Basic Exception Safety는 단순하게 exception 처리만 해준 것이다. exception이 발생했음에도 불구하고, 다른 변수가 변경될 수 있다. Strong Exception Safety는 Exception 처리로 다른 변수가 아예 변하지 않는다. No-throw guarantee 는 Exception 처리가 다른 함수로 넘어가지 않고, 원래 함수에서 끝나는 경우이다. 그리고 Swap, destructor, move에는 exception 처리를 하지 말자. 그리고 noexcept를 붙이도록 하.. c++ exception 정리 c++에서 exception을 처리함에 있어서 stack unwinding에 대해서 잘 알아야 한다 만약 c++에서 exception이 처리된다면 exception이 raise 되는 순간 함수가 stack에서 사라지며 catch 구문으로 옮겨지게 된다. 따라서 만약에 exception이 발생하는 코드 밑에 메모리 할당을 deallocation 하는 부분이 처리되지 않아서 메모리 leak이 발생할 수 있다. 따라서 스마트 포인터를 잘 사용해야 한다. 자세한 내용은 코드에 담아 두었다. 코드 >> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43.. 이전 1 ··· 3 4 5 6 7 8 9 ··· 13 다음