为什么我不能在此代码中将A *转换为B *?

时间:2017-09-17 20:08:28

标签: c++ pointers inheritance

我无法理解我做错了什么。我收到错误:上述行中从A *到B *的无效转换:

   B *p3=new A(p2->operator+(*p1));

这是完整的代码。

#include <iostream>

using namespace std;

#include <iostream>
using namespace std;

class A
{
  protected: int x;
  public: A(int i=-31) {x=i;}
  virtual A operator+(A a) {return x+a.x;}
};

class B:public A
{
  public:B(int i=12) {x=i;}
  B operator+(B b) {return x+b.x+1;}
  void afisare() {cout<<x;}
};

int main()
{
  A *p1=new B, *p2=new A;
  B *p3=new A(p2->operator+(*p1));
  p3->afisare();
  //cout << "Hello world!" << endl;
  return 0;
}

3 个答案:

答案 0 :(得分:1)

我认为你的遗产在这里倒退了。如果您有一个类型为A*的指针,则它可以指向类型为A的对象或类型为B的对象,因为B类型的对象是也是A类型的对象。但是,您不能在B*类型的对象上指向A类型的指针,因为并非所有类型为A的对象都是B类型的对象。

独立地,您可以重写该行

B *p3 = new A(p2->operator+(*p1));

as

B* p3 = new A(p2 + *p1);

可能会让事情变得更容易阅读。

答案 1 :(得分:1)

多态性只能单向运作。基指针可以指向派生类,因为派生类具有基类所具有的所有内容。但是,派生指针不能指向基类,因为派生类具有基类不具有的东西。

答案 2 :(得分:0)

 class A
    {
    }

    class B:public A
    {
    }

向上转换:A *a=new B;(主要在覆盖时使用)

向下转换:B *b=(B*)a;它只有在您尝试投射的指针(在我们的例子中为a)指向具体的派生对象时才有效。