C++ Antlr cpp运行时是否有错误的指针转换?

C++ Antlr cpp运行时是否有错误的指针转换?,c++,antlr,covariance,C++,Antlr,Covariance,我使用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; }; c

我使用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;
}
#包括
#包括
#包括
使用名称空间antlrcpp;
使用名称空间antlr4;
使用名称空间std;
B类{
公众:
虚拟void myhello()=0;
};
A类:公共B类{
公众:
字符串名;
A(字符串A):名称(A){
}
虚拟void myhello(){

cout您不能强制转换
f2()的结果
A*
,因为
A
派生自
B
,而您只创建了
B
的一个实例。这怎么可能成为一个有效的
A
实例呢?您可能是想通过将
A
作为基类,将
B
作为派生类来颠倒名称吗?

您无法转换
的结果f2()
A*
,因为
A
派生自
B
,而您只创建了
B
的一个实例。那怎么可能成为有效的
A
实例呢?您可能想通过将
A
作为基类,将
B
作为派生类来颠倒名称吗?

您需要A,您的问题已经脱离主题了没有它。@UlrichEckhardt,我提供了足够的代码,请删除-1并重新打开问题。@machine\u 1我提供了足够的代码,请删除-1并重新打开问题。您能否同时提供编译该代码时得到的逐字错误消息?是的,我已经投票决定用给定的代码重新打开此问题。您需要一个问题没有它是离题的。@UlrichEckhardt,我已经提供了足够的代码,请删除-1并重新打开问题。@machine_1我已经提供了足够的代码,请删除-1并重新打开问题。你能不能也提供编译代码时得到的逐字错误消息?是的,我已经投票决定用给定的代码重新打开这个问题代码。在f2中,我将其设置为B*,在f1返回的任何对象的内容中,它存储了a*的指针。但是a*可以被视为B*作为任何时间。哦,对了。我错过了。然后我认为这是一个问题。从
f2()
返回的任何对象不再包含
a
的实例。它已经被
B*v=f1().as()切掉了
。嗯,但我将指针传递给任何一个,指针的大小总是一样的。有什么专门处理指针的吗?在f2中,我将其传递给B*,在f1返回的任何内容中,它存储了a*的指针。但a*可以被视为B*。哦,对了。我错过了。然后我认为这是一个问题。您返回的任何对象
f2()
中的urn不再包含
A
的实例。它已被
B*v=f1()切掉。as();
。嗯,但我将指针传递给任何对象,指针的大小始终与我猜的相同。有专门处理指针的对象吗?