Antlr cpp 运行时 任何错误的指针转换?



我在使用 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*,因为BA的基础。

但是,antlr运行时中的Any<A*>不能as <B*>()

不能将f2()的结果强制转换为A*,因为A派生自B,并且您只创建了B的实例。如何成为有效的A实例?您是否可能打算通过A基类并B派生的基类来颠倒名称?

最新更新