考虑下面的代码:无效初始化错误而上溯造型和向下转换的对象
#include <typeinfo>
#include<iostream>
class Parent
{
public:
virtual void foo() const{};
};
class Child_A: public virtual Parent
{
};
void downcast(const Child_A& aa)
{
}
void upcast(const Parent& pp)
{
std::cout<< typeid(pp).name() << std::endl;
downcast(pp); // line 21: This is the problematic line!
}
int main()
{
Child_A aa;
upcast(aa);
return 0;
}
我得到一个编译错误:
initialization.cpp:21:14:错误:的参考无效初始化从类型的表达式 'const的父'
垂头丧气(PP)类型 'const的Child_A &';
但是,如果我编译代码没有行27,typeid(pp).name()
返回7Child_A
。
那么,为什么我会得到这个错误?我该如何解决它?什么是真正的pp
?
'typeid'是一个运行时操作符。仅仅给出'upcast',编译器不知道'pp'实际上是一个'Child_A'。 – chris
'pp'是对'Parent'的引用。您无法将对“Parent”的引用传递给期望引用“Child_A”的函数。 (并且此代码中没有投射,只是隐式转换。) – molbdnilo
此问题过于复杂,可能会缩减为更小,代表性的示例。 –