Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从构造函数调用全局函数_C++_Oop - Fatal编程技术网

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我编辑了这个问题以供将来参考。这个问题的目的不是关于类型是指针还是非指针,而是关于类类型。