본문 바로가기
스터디/C++

overwrite vfpr

by 유이얼 2019. 1. 27.

테스트 환경
- win10
- visual studio 2012

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
#include <stdio.h>
#pragma warning(disable:4996)
 
 
class A {
public:
    A() : a(1) { }
    virtual void f() { printf("A::f() = %d\n", a); }
    int a;
};
 
class B : public A {
public:
    B() : A() { 
        a = 2;
        this->A::A();
    }
 
    void f() { printf("B::f() = %d\n", a); }
};
 
int main() {
    A a;
    B b;
    A *pB = &b;
 
    a.f();
    b.f();
    pB->f();
    return 0;
}
cs

실행 결과. (A, B, B) 가 아니라  (A,B,A) 가 출력된다 (?)

결론
 - 객체마다 vfpr에 대한 정보를 가지고 있으며,
   해당 정보는 생성자 호출(초기화 리스트 처리 이후) 시 초기화 된다.
 - 자식 B 생성자 내부에서 부모 A 생성자를 호출한 경우, (this->A::A();)
   A class vfptr 정보로 다시 덮어 쓰여진다.

this->A::A(); 호출하지 않은 경우, vfpr 값이 다르다
this->A::A(); 호출한 경우, vfpr 값이 동일하다

 

'스터디 > C++' 카테고리의 다른 글

R-Value  (0) 2019.01.07
proxy class  (0) 2019.01.07