-
항목 9 : 객체 생성 및 소멸자에 절대로 가상 함수 호출 금지@ 16. 1 ~ 17. 1/Effective C++ 2015. 1. 15. 00:11
class A
{
public:
A()
{
log();
};
virtual void log() const=0;
};class B : public A
{
public:
virtual void log() const
{
cout << "B LOG"<< endl;
}
};class C : public A
{
public:
virtual void log() const
{
cout << "C LOG"<<endl;
}
};int main()
{
B b;
getch();
return 0;
}이런식으로 생성자에 가상함수 호출하지말라고(A)
왜냐면 가상함수라고 해도 지금 실행중인 생성자나 소멸자에 해당되는 클래스의 파생 클래스쪽으로 실행이 안됨
하지만 정말 저 함수 호출이 생성자에서 필요하다면..
1. 비가상 멤버 함수로 바꾸고 파생 클래스의 생성자에서 필요한 정보를 초기화 리스트를 이용하여 넘긴다.
즉
class A
{
public:
A(int num)
{
log(num);
};
void log(int num) const
{
cout <<" A LOG "<< endl;
}
};class B : public A
{
public:
B(int n) : A(n)
{}
virtual void log() const
{
cout << "B LOG"<< endl;
}
};class C : public A
{
public:
virtual void log() const
{
cout << "C LOG"<<endl;
}
};int main()
{
B b(3);
getch();
return 0;
}'@ 16. 1 ~ 17. 1 > Effective C++' 카테고리의 다른 글
항목 35 : 가상 함수 대신 쓸 것들도 생각해 두는 자세를 .. (0) 2015.01.25 항목 10 : 대입 연산자는 *this의 참조자를 반환한다 (0) 2015.01.15 항목 7:가상 소멸자 (0) 2015.01.14 항목6 : 복사생성자 및 대입연산자 제한 (0) 2015.01.14 항목 37 : 어떤 함수에 대해서도 상속받은 기본 매개변수 값은 절대로 재정의하지 말자 (0) 2014.06.02