글
생성자/파괴자 내부에서 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 . 생성자에서 부를 때 명확한 예
#include<string>
#include<iostream>
using namespace std;
class B {
public:
B(const string& ss) { cout << "B constructor\n"; f(ss); }
virtual void f(const string&) { cout << "B::f\n";}
};
class D : public B {
public:
D(const string & ss) :B(ss) { cout << "D constructor\n";}
void f(const string& ss) { cout << "D::f\n"; s = ss; }
private:
string s;
};
int main()
{
D d("Hello");
}
결과
B constructor
B::f
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 를 참조하려고 한다.)