2014-09-08 15 views
5

jestem ciekawy co do zachowania z następujących powodów:Wywołanie funkcji z wirtualnego konstruktora członkiem

#include <iostream> 
#include <string> 
struct A; 
struct B { 
    std::string b; 
    B(A& a); 
}; 
struct A { 
    B member; 
    virtual std::string f() { return "Hello, World!"; } 
    A() : member(*this) {} 
}; 
B::B(A& a) : b(a.f()) {} 
int main() { 
    std::cout << A().member.b; 
} 

Czy to wymagane wydrukować oczekiwanego rezultatu? Czy jest to niezdefiniowane zachowanie?

Odpowiedz

6

Jest to zgodne z prawem. §12.7 [class.cdtor]/P4:

funkcjami użytkownika, w tym funkcji wirtualnych (10.3), może być nazywany podczas budowy lub zniszczenia (12.6.2). Gdy funkcja wirtualna jest wywoływana bezpośrednio lub pośrednio z konstruktora lub z destruktora , w tym podczas konstruowania lub niszczenia niestatycznych elementów danych klasy klasy , a obiektem, do którego odnosi się wywołanie jest obiekt (nazwij to x) w trakcie budowy lub zniszczenia, funkcja nazywana jest ostatecznym przełożeniem w klasie konstruktora lub destructor, a nie nadpisuje ją w klasie bardziej pochodnej. Jeżeli wywołanie wirtualnej funkcji wykorzystuje wyraźny dostępu członka klasy (5.2.5), a ekspresja obiektu odnosi się do całkowitego przedmiotu x lub jedną z klasy bazowej podobiektów tego obiektu, ale nie x lub jednej z jego każdej klasy bazowej zachowanie jest niezdefiniowane.

W tym przypadku sprawa UB nie ma zastosowania.

+0

Nigdy nie rozumiem tego .. dlaczego to się nie dzieje? 'a.f()' powinno odnosić się do kompletnego obiektu x. Czy czytam to źle? –

+0

@MarcoA. UB występuje tylko wtedy, gdy odnosi się do kompletnego obiektu 'x' lub jednego z podobiektów klasy bazowej tego obiektu **, ale nie do' x' lub do jednego z jego podobiektów klasy podstawowej **. W tym przypadku odpowiednim obiektem w budowie jest "A", a wyrażenie obiektowe odnosi się do obiektu w trakcie budowy, więc zachowanie jest dobrze zdefiniowane. –

+0

Dzięki za pomoc: "Obiekt, który nie jest podobiektem żadnego innego obiektu, nazywany jest obiektem pełnym.", Więc czy "a" nie odnosi się tutaj do kompletnego obiektu? –

Powiązane problemy