객체지향을 이루는 다형성, 캡슐화, 상속 등... 철저히 지키라고 할수록 마구마구 어기고 싶다.
그래서 어겨봤다.
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 | using namespace std; class Widget { public: Widget(int init_num,char* init_str) :m_val(init_num) { int str_length = strlen(init_str) + 1; m_str = new char[str_length]; strcpy(m_str, init_str); } ~Widget() { delete[] m_str; } private: int m_val; char* m_str; }; int main(void) { Widget w(128, "ABCD"); //w.m_val; //w.m_str; 같은 접근은 불가능하다. //포인터를 통해서 주소값을 얻은 후 이것을 이용하면 가능하다 Widget* pw = &w; printf("%d, %s \n", *pw, *(pw + 4)); //그렇다면 참조자는 어떨까? Widget& rw = w; printf("%d, %s \n", *(&rw),*(&rw+4)); //참조자를 해보니까 그럼 다시w로 해보면 되네? printf("%d, %s \n", *(&w),*(&w+4)); //결론 땅땅 우리의 컴파일러님은 주소로 접근하는 것에서는 별도로 //접근 제어에 대한 판정을 해주지 않는다! return 0; } | cs |
그렇다!
나는 포인터로만 해봤는데 생각난김에 해보니까 참조자도 되고 인스턴스 그 자체로도 된다.
여기서 끝내면 섭섭하니까 virtual 함수가 포함된 클래스로도 해보자.
virutal 함수에 대한 설명은 생략하고,
virutal 함수가 있는 클래스의 인스턴스는 그 주소값으로 버츄얼 함수 테이블(vtbl)에 대한 포인터인 vptr을 가진다.
vptr은 int* 이므로 4바이트이다.
따라서 버츄얼 함수를 포함하는 인스턴스에서 위와 코드와 같은 접근을 하려면 +4를 쌈박하게 해주면 될 것이다.
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 | using namespace std; class Widget { public: Widget(int init_num,char* init_str) :m_val(init_num) { int str_length = strlen(init_str) + 1; m_str = new char[str_length]; strcpy(m_str, init_str); } ~Widget() { delete[] m_str; } virtual void VirtualFunc() { cout << "I'm virtual function" << endl; } private: int m_val; char* m_str; }; int main(void) { Widget w(128, "ABCD"); //w.m_val; //w.m_str; 같은 접근은 불가능하다. //포인터를 통해서 주소값을 얻은 후 이것을 이용하면 가능하다 Widget* pw = &w; printf("%d, %s \n", *(pw+4), *(pw + 8)); //그렇다면 참조자는 어떨까? Widget& rw = w; printf("%d, %s \n", *(&rw+4),*(&rw+4+4)); //참조자를 해보니까 그럼 다시w로 해보면 되네? printf("%d, %s \n", *(&w+4),*(&w+4+4)); //결론 땅땅 우리의 컴파일러님은 주소로 접근하는 것에서는 별도로 //접근 제어에 대한 판정을 해주지 않는다! return 0; } | cs |
엇.. 안된다...
알아고보 다시 오겠다
이사람은 콘돔에 구멍을 뚫어 질사공격을 할 사람이다
왜 안될까나 -_- vtbl은 4바이트가 아니란말인가?
디버거로 해보면 알겠지
디버거로 보는데 메모리에 쓰여있는게 뭔지 모르겠따!
흠 +4바이트 해주는게 맞는데
64비트인가보지
주소값 확인해서 보니까 w의 주소갑에서 +4 바이트 한 부분에 m_val이 있고, m_val도 확인해서 보니까 담겨져있는값이 128 맞음
와 26일후 전역이라니 ㅎㅎ