생성자/파괴자 내부에서 virtual 함수 사용이 안되는(virtual 대신 일반 함수처럼 동작됨) 이유

Game Programming/C++ 2018. 3. 8. 07:18

https://stackoverflow.com/questions/962132/calling-virtual-functions-inside-constructors

https://isocpp.org/wiki/faq/strange-inheritance#calling-virtuals-from-ctors

1 . 생성자에서 부를 때 명확한 예

  1. #include<string>
  2. #include<iostream>
  3. using namespace std;
  4. class B {
  5. public:
  6. B(const string& ss) { cout << "B constructor\n"; f(ss); }
  7. virtual void f(const string&) { cout << "B::f\n";}
  8. };
  9. class D : public B {
  10. public:
  11. D(const string & ss) :B(ss) { cout << "D constructor\n";}
  12. void f(const string& ss) { cout << "D::f\n"; s = ss; }
  13. private:
  14. string s;
  15. };
  16. int main()
  17. {
  18. D d("Hello");
  19. }

결과

  1. B constructor
  2. B::f
  3. D constructor


만일 B::f 대신 D::f 를 허용한다면 D constructor 호출 이전이므로

s = ss; 에서 초기화되지 않은 string s 를 사용해야하므로 crash 가 발생할 수 있다.

 C++ is protecting you from that danger. 의 차원에서 허용되지 않는다고 볼 수 있다.


2. 파괴자에서는 생성자 호출 순서의 역순으로 수행되므로

위의 클래스 예를 들어보면 D 의 파괴자 호출 후에 B 파괴자가 호출된다.

B 파괴자 내부에서 f(ss); 를 호출하여 D::f 를 호출 한다는 것도 성립할 수 없게 된다.(만일 D::f 가 호출된다면 이미 파괴된 string s 를 참조하려고 한다.)


설정

트랙백

댓글