我在使用 antlr cpp 运行时时收到以下错误。 伪代码:
#include <iostream>
#include <antlr4-common.h>
#include <antlr4-runtime.h>
using namespace antlrcpp;
using namespace antlr4;
using namespace std;
class B{
public:
virtual void myhello() = 0;
};
class A:public B{
public:
string name;
A (string a):name(a){
}
virtual void myhello(){
cout << "hello "<< name <<endl;
}
};
Any f1(){
A *a = new A("hello");
return Any(a);
}
Any f2(){
B* v= f1().as<B*>();
return Any(v);
}
int main(){
auto x = f2();
x.as<A*>()->myhello();
return 0;
}
错误:bad_cast行B* v= f1().as<B*>()
;
但是当我在f1
中写B* b= new A();
时,它变得OK。
我想这与协方差有关。
A*
实例始终可以强制转换为B*
,因为B
是A
的基础。
但是,antlr运行时中的Any<A*>
不能as <B*>()
。
不能将f2()
的结果强制转换为A*
,因为A
派生自B
,并且您只创建了B
的实例。如何成为有效的A
实例?您是否可能打算通过A
基类并B
派生的基类来颠倒名称?