객체지향을 이루는  다형성, 캡슐화, 상속 등... 철저히 지키라고 할수록 마구마구 어기고 싶다.


그래서 어겨봤다.


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


엇.. 안된다...


알아고보 다시 오겠다