2017-03-07 14 views
2

은 정의되지 않은 행동이, 되지 않은 호출 다음과 같은 코드를 않습니다 안 그래?자격이없는 T 생성자에서 순수 가상의 클래스 T 구현을 호출합니까? 클래스 <code>T</code>의 생성자에서 (직접 또는 간접적으로)을 <code>T</code> 멤버 함수의 가상 전화가 대부분에서 <code>T</code>의 구현에 가서 할 수있는 고려

참고 : 노이즈를 방지하려면 : 생성자에서 호출 할 때 멤버 함수가 사실상 호출되지 않는다고 생각되면 여기에 답하거나 주석을 달지 말고 별도의 SO 문제에서이 문제를 제기하십시오. 고맙습니다.

struct Baze 
{ 
    virtual void foo(); 
    virtual void bar() = 0; 
    Baze(){ foo(); bar(); } 
}; 

void Baze::foo() {} 
void Baze::bar() {} 

struct Derived: Baze 
{ 
    void bar() override {} 
}; 

int main() 
{ 
    Derived{}; 
} 
+1

익명 downvoter는, 당신의 downvote를 설명하십시오. –

+1

당신은 잠재적 인 종류의 하강자에게 모순되는 지시를 내 렸습니다. 여기에 언급하지 않고 투표를 설명해야합니다. –

+0

@ M.M. 아니오, 그들은 단순히 무지에서 다운 다운하지 말고, 그 문제를 SO 문제로 제기하십시오. 내가 눈치 챘을 때 중복으로 투표를 마감 할 것입니다. :) –

답변

5

나는 이것이 [class.abstract]/6 (N4140)에 의해 덮여 있다고 생각 :

멤버 함수가 생성자 (또는 소멸자) 추상 클래스에서 호출 할 수 있습니다; 그러한 생성자 (또는 소멸자)로부터 생성 (또는 파기) 된 객체에 대해 직접 또는 간접적으로 가상 가상 함수() 가상 호출 (10.3)을 만드는 효과는 정의되지 않습니다.

순수 가상 함수에 대한 정의를 제공하더라도 기술적으로 여전히 UB입니다.

여기에는 here에 대한 핵심 작업 그룹 문제가 있습니다. 이 규칙을 잘 정의하기 위해 규칙이 변경되지 않는 것 같습니다.

+0

고마워, 분명해 보인다. 문제는 g ++과 Visual C++ 모두 경고없이 (심지어'-Wall -Wextra -pedantic-errors'와 함께 g ++ 에서조차도) 코드를 컴파일한다는 것입니다. –

+1

@ Cheersandhth.-Alf UB, 부적절한 형태가 아닙니다. (예를 들어, 순수 가상이 호출된다는 것은 명확하지만,'bar'에 대한 호출이 실제로 생성자에서'bar'를 호출하지 않는 다른 함수에서 온 것이면 - 그러나 다른 함수에서 호출 할 수 있다면 - 그렇습니다. 더 까다로울 것입니다.) –

+0

DR 참조 주셔서 감사합니다. :) –