从构造函数调用全局函数

Calling global function from constructor

本文关键字:全局 函数 函数调用      更新时间:2023-10-16

我有这样的代码:

#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指针类型是A*类型?

可以。

这个东西是B对象也是A对象。当您在A的函数内部时,类不知道它是否是B。因此this -ptr的类型为A*

当你调用B内部的函数时,它是B*

工作草案(this指针)[9.2.2.1/1]中提到:

类X的成员函数中this的类型为X*。

注意,构造函数是特殊成员函数AB的子对象,因此A成员函数体中的this指针是A*类型,而B成员函数中的B*类型。
还要注意,A中的thisB中的this也可以有不同的值,也就是说,它们可以指向不同的子对象。
例如:

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


编辑

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

对,就是这个意思。