从构造函数调用全局函数
Calling global function from constructor
我有这样的代码:
#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*。
注意,构造函数是特殊成员函数, A
是B
的子对象,因此A
成员函数体中的this
指针是A*
类型,而B
成员函数中的B*
类型。
还要注意,A
中的this
和B
中的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编辑了这个问题并改变了它的意思,但我宁愿在这个答案中留下原始问题的引用。
回滚可能是对该编辑的适当操作。
无论如何,答案仍然适用。
对,就是这个意思。
相关文章:
- 全局函数参数
- 如何定义全局函数指针并分配给特定地址
- 为什么全局函数 void showA(A&x) 能够访问 A 类的私有成员?
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- CUDA 全局函数未正确添加某些索引的数组值
- Qt - 定义 QML 的全局函数
- 如何在全局函数中访问链表的头部和尾部
- 如何在 c++ 中的全局函数中调用类的对象
- 类方法和全局函数中的别名
- 在C 中将全局函数包括在命名空间中
- 用于定义全局函数"using namespace"
- 为什么在 2 个不同的 cpp 文件中定义内联全局函数会导致神奇的结果
- 使用 lambda 和全局函数调用 ranges::for_each
- Djinni 能否从C++全局函数中生成必要的代码
- 当在Python中定义__str__时,如何将C 的标准全局函数覆盖
- 有没有一种方法可以使全局函数/静态成员函数一次可呼出
- 为什么我不能在头文件中定义全局函数
- 为什么 std::get<T> for 'variant' 是一个全局函数?
- 从C源文件调用C++源文件中定义的全局函数
- 是否可以通过引用将方法从类传递到全局函数或在类之间传递?