从构造函数调用全局函数

Loa*_*oay 10 c++ oop

我有这个代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

其中输出是:

一个

这是否意味着this传递给构造函数的指针A()类型是A*什么类型?

Hay*_*ayt 12

是.

东西是一个B对象也是一个A对象.虽然你A在类的功能里面不知道它是否是一个B.所以this-ptr将是类型A*.

当你调用函数内部BB*.

  • @Loay:如果您对动态调度在构造函数中的工作方式感兴趣,请在"构造函数"中搜索此站点中的"虚函数".无论你使用什么指针,`this`的类型总是`A*`.但是如果你使用它来调用一个虚函数,那么重要的是*当你在自己的构造函数中时,*派生最多的对象*也是*A`-子对象.它只会在*对象的生命开始之后成为完整的对象,只有在其*构造函数之一返回之后才会生成. (3认同)

sky*_*ack 8

正如工作草案[9.2.2.1/1]中提到的那样(这个指针):

的类型的  这一  类中的X的成员函数是X*.

注意构造函数是一个特殊的成员函数,并且A是一个子对象B,因此this成员函数体内的指针A是类型的A*,而它是B*成员函数中的类型B.
还要注意thisfrom Athisfrom 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;
}
Run Code Online (Sandbox Code Playgroud)

那说:

这是否意味着 传递给构造函数的  this指针A()的类型是A什么类型  ?

不,不是.这是类型A*.


编辑

尽管OP编辑了这个问题并改变了它的含义,但我宁愿在这个答案中留下原始问题的引用.
回滚对于该编辑可能是适当的操作.
无论如何,答案仍然适用.