C++ 从构造函数调用全局函数
我有以下代码:C++ 从构造函数调用全局函数,c++,oop,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
#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;
}
#包括
使用名称空间std;
结构A;
结构B;
void g(A*A){cout是的,这正是它的意思。是的
这是一个B
对象,也是一个a
对象。当您在a
函数中时,类不知道它是否是B
。因此这个-ptr将是a*
类型
当您在B
中调用函数时,它是B*
,如工作草稿的第页所述(此指针的位置):
类X的成员函数中该的类型为X*
请注意,构造函数是一个特殊的成员函数,a
是B
的子对象,因此a
的成员函数体中的这个指针属于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{
(){std::cout您的代码中没有虚拟方法,所以所有的键入都是纯静态的。@Angew:这与这个问题没有多大关系。@Angew如果在中添加虚拟方法,输出仍然是一样的though@KerrekSB在a
的成员函数中,this
的静态类型不能实现实际上,除了A*
之外,任何东西都可以。关于虚拟现实的评论是为了解决“绑定步骤”问题中的一点:只涉及静态绑定。因此绑定是静态完成的。如果我在中添加虚拟方法,绑定仍然是静态的吗?我的答案与静态绑定无关,但仍然是正确的。另外,对于虚拟方法问题:当使用继承时,应该始终声明的析构函数基类是虚拟的。@Loay:在“构造函数”中搜索此站点的“虚拟函数”如果您对动态分派在构造函数中的工作方式感兴趣,this
的类型始终是A*
,无论您使用指针做什么。但是如果您确实使用它来调用虚拟函数,那么重要的是,当您在自己的构造函数中时,最派生的对象也是A
-子对象。打开ly在对象的生命开始后成为完整的对象,这只是在它的一个构造函数返回之后。不,它不是。从技术上讲它是A*
。这个答案是错误的。@skypjack是的,你们是对的。我假设人们意识到我指的是这个ptr的类型,而不是这个类型。现在修复了。@skypjack是的,OP就是这么说的。@GillBates OP就是这样修改他的问题的,而不是他说的。查看我的答案或问题历史记录,看看他说了什么。@skypjack但现在它被修改了,所以你可以删除评论:^)@GillBates实际上他修改了问题,现在它是一个完全不同的问题,所以OP应该回滚编辑。@skypjack我编辑了这个问题以供将来参考。这个问题的目的不是关于类型是指针还是非指针,而是关于类类型。