2016-09-06 15 views
10

mam ten kod:Wywołanie globalną funkcję z konstruktora

#include <iostream> 
using namespace std; 

struct A; 
struct B; 

void g(A* a){ cout << "A";} 
void g(B* b){ cout << "B";} 

struct A{ 
    A(){ g(this); } 
}; 

struct B : A{ 
    B(){} 
}; 


int main() { 
    B* b=new B(); 
    return 0; 
} 

w którym wyjście jest:

Czy to znaczy typ this wskaźnik przekazany do konstruktora A() jest typu A*?

+0

W kodzie nie ma wirtualnych znaków, więc wszystkie pisanie odbywa się wyłącznie statycznie. – Angew

+2

@Angew: To ma jednak niewiele wspólnego z tym pytaniem. –

+0

@Angew, jeśli dodam metodę wirtualną w A, wynik jest taki sam, chociaż – Loay

Odpowiedz

12

Tak.

Chodzi o to, że obiekt B jest także obiektem A. Gdy jesteś wewnątrz funkcji A, klasa nie wie, czy jest to B czy nie. Tak więc, this -ptr będzie typu A*.

Podczas wywoływania funkcji wewnątrz B jest to B*.

+0

, więc wiązanie odbywa się statycznie. jeśli dodaję metodę wirtualną w A, czy powiązanie będzie nadal statyczne? – Loay

+0

Moja odpowiedź nie ma nic wspólnego z wiązaniem statycznym, ale nadal będzie prawdą. Również w przypadku metody virutal: podczas korzystania z dziedziczenia zawsze powinieneś zadeklarować destruktor wirtualnej klasy bazowej. – Hayt

+3

@Loay: Wyszukaj na tej stronie "funkcje wirtualne" w "konstruktorach", jeśli interesuje Cię sposób działania dynamicznego wysyłania w konstruktorze. Typ 'this' jest zawsze' A * ', bez względu na to, do czego użyjesz wskaźnika. Ale jeśli użyjesz go do wywołania funkcji wirtualnej, ważne jest to, że * najbardziej wyprowadzonym obiektem * jest * także pod-obiekt 'A', gdy jesteś w swoim własnym konstruktorze. Staje się on tylko kompletnym obiektem, gdy * zaczęło się życie * obiektu, a to dopiero po powrocie jednego z jego * konstruktorów. –

4

Tak, właśnie to oznacza.

+0

@skypjack Tak, właśnie to OP powiedział. –

+0

@GillBates W ten sposób OP zmodyfikował swoje pytanie, a nie to, co powiedział. Zobacz moją odpowiedź lub historię pytań, aby zobaczyć, co powiedział. – skypjack

+0

@skypjack Ale teraz jest zmodyfikowany, więc możesz usunąć komentarz: ^) –

8

Jak wspomniano w [9.2.2.1/1] w wersji roboczej (wskaźnik this):

Rodzaj tym w funkcji składowej klasy X to X *.

Zauważmy, że konstruktor jest Specjalna funkcja członek i A jest podobiekt z B, zatem wskaźnik this wewnątrz ciała funkcji członkowskich A jest typu A*, gdy jest on typu B* zasięgu funkcje składowe B.
Należy również zauważyć, że numery this od A i this od mogą również mieć różne wartości, tzn. Mogą wskazywać na różne podobiekty.
Jako przykład:

#include<iostream> 

struct A { 
    A() { std::cout << this << std::endl; } 
    int i{0}; 
}; 

struct B: A { 
    B() { std::cout << this << std::endl; } 
    virtual void f() {} 
}; 

int main() { 
    B b; 
} 

stwierdzili, że:

Czy to znaczy typ ten wskaźnik przekazany do konstruktora A() jest typu A?

Nie, nie jest. Jest to typ A*.


EDIT

Pomimo OP edytowane pytanie i zmieniły swoje znaczenie, wolałbym zostawić w tym odpowiedzi na cytat z pierwotnego pytania.
Wycofanie byłoby dobrym działaniem dla tej edycji.
W każdym razie odpowiedź nadal obowiązuje.