2012-12-10 2 views
4
class A 
{ 
public: 
    ... 
    virtual bool Function(..) const {...} 
} 

class B : public A 
{ 
public: 
    ... 
    virtual bool Function(..) const {...} 
} 

class OtherClass 
{ 
public: 
    OtherClass(A& a) 
    { 
     m_bool = a.Function(..); 
    } 
private: 
    bool m_bool; 
} 

클래스 A 또는 클래스 B가 OtherClass 클래스 생성 전에 완전히 초기화되었다고 가정합니다.현재 클래스의 생성자에서 다른 클래스에 정의 된 가상 함수를 호출합니다.

질문> OtherClass의 생성자에서 가상 함수를 호출하는 것과 관련된 문제가 있습니까?

+0

시도해 보셨습니까? 어떻게 된 거예요? –

답변

5

아니요, 문제가있는 이유는 무엇입니까? A의 인스턴스가 OtherClass의 생성자에 (참조를 통해) 전달되면 이미 완전히 초기화되므로 가상 함수가 예상대로 작동합니다.

들었을 경고는 생성자 내부에서 생성중인 객체의 가상 함수를 호출하는 것에 관한 경고입니다. 이 경우 가상 디스패치가 비활성화됩니다. 즉, 각 기본 클래스의 생성자에서 호출되는 가상 함수 버전은 생성자가 실행되는 기본 클래스 중 하나입니다.

기본 클래스 생성자 내에서 개체의 최종 형식이 아직 지정되지 않았습니다. 즉, 기본 클래스에서 상속 한 객체를 생성하는 동안 "기본"유형으로 시작하고 각 파생 클래스 생성자가 실행될 때 파생 된 유형으로 전환됩니다. 이것은 다양한 생성자가 실행될 때 볼 가상 함수의 버전을 반영합니다.

자세한 내용은 here을 참조하십시오.

이 생성자에 전달 된 객체에 영향을 미치지 않습니다. 왜냐하면 객체가 이미 완전히 구성되어 있으므로 "최종 유형"(따라서 해당 가상 함수 집합)이 이미 완전히 설정되어 있기 때문입니다.

+1

Effective C++에서 아이디어를 얻지 못했다고 생각합니다. Item 9 : 건설이나 파괴 중 가상 함수를 호출하지 마십시오. – q0987

+0

@ q0987 : 이에 대한 설명이 추가되었습니다. –

+2

@ q0987 : 건설 또는 파괴 중에 _same_ 개체에 가상 함수를 호출하지 마십시오. –

2

순수 가상 함수 나 추상 기본 클래스가 아닌 함수가 정의되어 있으면 함수 호출이 잘되어야합니다. a 개체는 가상 함수를 예상대로 호출하므로 질문에 대한 대답은 아니요입니다.

0

A/B의 가상 함수 호출은 OtherClass의 생성자 또는 다른 곳에서 호출되는지 여부와 아무 관련이 없습니다. 그래서 아무런 문제도 없습니다.

관련 문제