C++虚函数中this指针的返回类型疑问
问题解析
1. E::f()中this指针的实际类型
你搞错了E类成员函数里this的类型:在E的非静态成员函数中,this的类型是E* const,不是你以为的C*。C++标准明确规定,类X的非静态成员函数中,this指针的类型为X* const(若为const成员函数则是const X* const)。所以E::f()里return this;返回的就是E*类型,完全匹配函数签名的返回要求,不存在类型不兼容的问题。
2. 为什么auto p的类型是C*
虽然运行时通过虚函数机制实际执行的是E::f(),但编译阶段pc->f()的静态返回类型由pc的类型(C*)决定。C++允许虚函数返回类型协变:派生类虚函数可以返回基类虚函数返回类型的派生类指针/引用,但调用表达式的静态返回类型仍为基类的返回类型(C*)。因此auto p会被推导为C*,这就是typeid(p).name()输出P1C(编译器对C*的名称修饰结果)的原因。
内容的提问来源于stack exchange,提问作者matteo camillo
相关产品推荐
相关产品推荐

