请求非标量类型

leg*_*o69 1 c++ inheritance pointers

有人可以帮我解决一个错误

conversion from `A' to non-scalar type `B' requested
Run Code Online (Sandbox Code Playgroud)

我有A类并从它派生B,但我对这些行有问题:

A a(1);
A *pb = new B(a);
B b = *pb;    //here I have an error
Run Code Online (Sandbox Code Playgroud)

提前感谢您的帮助

class A {
protected:
    int player;
public:
    A(int initPlayer = 0);
    A(const A&);
    A& operator=(const A&);
    virtual ~A(){};
    virtual void foo();
    void foo() const;
    operator int();
};

class B: public A {
public:
    B(int initPlayer): A(initPlayer){};
    ~B(){};
    virtual void foo();
};
Run Code Online (Sandbox Code Playgroud)

编辑

我有这个代码和(我不能改变它):

A a(1);
A *pb = new B(a);
B b = *pb;    
Run Code Online (Sandbox Code Playgroud)

我试图为B创建构造函数:

B::B(const A & a):
    player(a.player){}

B& B::operator=(const A& a){
    if(this == &a){
        return *this;
    }
    player = a.player;
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

但它给了我一个错误,真的需要专业人士的帮助

R S*_*hko 6

您的问题是由于静态类型检查.当你有这条线时:

A *pb = new B(a);
Run Code Online (Sandbox Code Playgroud)

静态类型pbA *和它的动态类型是B *.虽然动态类型是正确的,但编译器正在检查静态类型.

对于这个简单的代码,因为您知道动态类型pb始终是B,您可以使用静态强制转换来解决此问题:

B b = *static_cast<B *>(pb); 
Run Code Online (Sandbox Code Playgroud)

但要注意,如果动态类型pb是一个A *演员会导致未定义的行为.

  • @ lego69 - 一种常见的技术是创建一个虚拟的`clone`方法,让每个类都覆盖它.除此之外,我不能不知道*为什么*你试图复制你的对象. (2认同)