我有这段代码:
#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;
}
其中输出为:
A
这是否意味着传递给构造函数this
的{{1}}指针的类型是A()
类型?
答案 0 :(得分:12)
是
事物是B
对象也是A
对象。当您处于A
的函数内时,该类不知道它是否是B
。因此this
- ptr的类型为A*
。
当您在B
内调用函数时,它是B*
。
答案 1 :(得分:8)
正如工作草案[9.2.2.1/1]中提到的那样(这个指针):
X类成员函数中 this 的类型是X *。
请注意,构造函数是特殊成员函数,A
是B
的子对象,因此成员函数体内的this
指针A
的类型为A*
,而B*
的成员函数中的类型为B
。
另请注意,来自this
的{{1}}和来自A
的{{1}}也可以具有不同的值,即它们可以指向不同的子对象。
举个例子:
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()
。
修改强>
尽管OP编辑了问题并改变了其含义,但我宁愿在这个答案中留下原始问题的引用。
回滚对于该编辑可能是适当的动作。
无论如何,答案仍然适用。
答案 2 :(得分:4)
是的,这正是它的意思。