2016-09-06 3 views
10

У меня есть этот код:Вызов глобальной функции из конструктора

#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; 
} 

в которого выход:

Означает ли это тип this указатель передается в конструктор A() имеет тип A*?

+0

В вашем коде нет виртуальных машин, поэтому все набираемые файлы выполняются исключительно статически. – Angew

+2

@Angew: Это очень мало связано с этим вопросом. –

+0

@ Если я добавлю виртуальный метод в A, вывод все равно будет таким же, хотя – Loay

ответ

12

Да.

вещь B объект также A объект. Пока вы находитесь внутри функций A, класс не знает, является ли это B или нет. Таким образом, this -ptr будет иметь тип A*.

Когда вы вызываете функции внутри B, это B*.

+0

, поэтому привязка выполняется статически. если я добавлю виртуальный метод в A, будет ли привязка неподвижной? – Loay

+0

Мой ответ не имеет отношения к статической привязке, но тогда это все равно будет правдой. Также для проблемы с вирусом: когда вы используете наследование, вы всегда должны объявлять деструктор базового класса виртуальным. – Hayt

+3

@Loay: найдите этот сайт для «виртуальных функций» в «конструкторе», если вам интересно, как динамическая диспетчеризация работает в конструкторах. Тип 'this' всегда' A * ', независимо от того, для чего вы используете указатель. Но если вы используете его для вызова виртуальной функции, то важно то, что * самый производный объект * также * * - подобъект 'A', пока вы находитесь в его собственном конструкторе. Он становится единственным объектом только один раз, что * жизнь объекта началась, только после того, как один из его * конструкторов вернулся. –

4

Да, это именно то, что он означает.

+0

@skypjack Да, это то, что сказал OP. –

+0

@ GillBates Вот как ОП изменил свой вопрос, а не то, что он сказал. Посмотрите мой ответ или историю вопроса, чтобы посмотреть, что он сказал. – skypjack

+0

@skypjack Но теперь он изменен, поэтому вы можете удалить комментарий: ^) –

8

Как уже упоминалось в [9.2.2.1/1] рабочего проекта (далее этот указатель):

Тип этого в функции-члене класса X является X *.

Обратите внимание, что конструктор является специальной функцией члена и A является подобъектом B, таким образом, this указателя внутри тела функций членов A имеет типа A*, в то время как он тип B* в пределах функции-члены от B.
Обратите также внимание на то, что от A и this от B также могут иметь разные значения, то есть они могут указывать на разные подобъекты.
В качестве примера:

#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; 
} 

Это сказал:

Означает ли это тип этот указатель, переданный в конструктор A() имеет тип A?

Нет, это не так. Это тип A*.


EDIT

Несмотря на О.П. редактировал вопрос и изменил его смысл, я предпочел бы оставить в этом ответ на цитату из оригинального вопроса.
Откат может быть правильным действием для этого редактирования.
В любом случае, ответ по-прежнему применяется.

Смежные вопросы