Подтвердить что ты не робот

Вызов глобальной функции из конструктора

У меня есть этот код:

#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*?

4b9b3361

Ответ 1

Да.

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

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

Ответ 2

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

Тип this в функции-члене класса X есть X *.

Обратите внимание, что конструктор является специальной функцией-членом, а A является подобъектом B, поэтому указатель this внутри тела функций-членов A имеет тип A*, тогда как имеет тип B* в пределах функций-членов B.
Также обратите внимание, что this из 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*.


ИЗМЕНИТЬ

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

Ответ 3

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