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)
但它给了我一个错误,真的需要专业人士的帮助
您的问题是由于静态类型检查.当你有这条线时:
A *pb = new B(a);
Run Code Online (Sandbox Code Playgroud)
静态类型pb是A *和它的动态类型是B *.虽然动态类型是正确的,但编译器正在检查静态类型.
对于这个简单的代码,因为您知道动态类型pb始终是B,您可以使用静态强制转换来解决此问题:
B b = *static_cast<B *>(pb);
Run Code Online (Sandbox Code Playgroud)
但要注意,如果动态类型pb是一个A *演员会导致未定义的行为.
| 归档时间: |
|
| 查看次数: |
4393 次 |
| 最近记录: |