从构造函数

时间:2016-09-06 12:25:44

标签: 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;
}

其中输出为:

  

A

这是否意味着传递给构造函数this的{​​{1}}指针的类型是A()类型?

3 个答案:

答案 0 :(得分:12)

事物是B对象也是A对象。当您处于A的函数内时,该类不知道它是否是B。因此this - ptr的类型为A*

当您在B内调用函数时,它是B*

答案 1 :(得分:8)

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

  

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

请注意,构造函数是特殊成员函数AB的子对象,因此成员函数体内的this指针A的类型为A*,而B*的成员函数中的类型为B。 另请注意,来自this的{​​{1}}和来自A的{​​{1}}也可以具有不同的值,即它们可以指向不同的子对象。
举个例子:

this

那说:

  

这是否意味着传递给构造函数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; } 类型?

不,不是。它的类型为A()

修改

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

答案 2 :(得分:4)

是的,这正是它的意思。