Ответ 1
Да.
Объектом B
является объект A
. Пока вы находитесь внутри функций A
, класс не знает, является ли это B
или нет. Таким образом, this
-ptr будет иметь тип A*
.
Когда вы вызываете функции внутри B
, это B*
.
У меня есть этот код:
#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*
?
Да.
Объектом B
является объект A
. Пока вы находитесь внутри функций A
, класс не знает, является ли это B
или нет. Таким образом, this
-ptr будет иметь тип A*
.
Когда вы вызываете функции внутри B
, это B*
.
Как указано в [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*
.
ИЗМЕНИТЬ
Несмотря на то, что ОР отредактировал вопрос и изменил его значение, я предпочел бы оставить в этом ответе цитату из исходного вопроса.
Откат будет правильным действием для этого редактирования, возможно.
Во всяком случае, ответ по-прежнему применяется.
Да, это именно то, что это значит.