向上转型指针

Upcasting pointers

本文关键字:指针 转型      更新时间:2023-10-16

我对c++中指针的上转换有疑问。

我要写一个例子来说明我的问题:

class A {}
class B : public A {}
A* pA = new A();
B* pB = new B();
pA = pB; //fails
pA = dynamic_cast<A*>(pB); //fails
我不知道我错过了什么。我想我完全不明白你在说什么。请帮忙好吗?由于

更新错误:

[exec] ..asdfqwerty.cpp(123) : error C2681: 'B*' : invalid expression type for dynamic_cast

我发现它是如何工作的,像这样:

pA* = (pA*)pB; 

但我不明白为什么。

编辑:我的编辑告诉我:"类型B*的值不能分配给类型a *的实体"。这是什么意思?

更确切地说,pB是由函数返回的。我不知道这是否有什么关系:就像这样:
class C { 
    B* pB;
    B* getB() { return pB; }
}
A* pA;
pA = c.getB(); //this crashes. c was declared before... it is just an example

您的类定义中缺少分号。c++中的升级是完全合法的,可以用隐式的方式(多态)来完成。

class A {
public:
  virtual ~A() {}
};
class B : public A {};
int     main()
{
  A* pA;
  B* pB = new B();
  pA = pB;
  delete pB;
  return (0);
}

同样,您应该将A的析构函数声明为virtual,以避免潜在的内存泄漏。如果您不这样做,并尝试删除B的实例,则将调用A的析构函数,但不会调用B的析构函数,从而使B持有的所有已分配资源未释放。

类定义后缺少分号;:

class A {};
class B : public A {};

同样为dynamic_cast返回一个有意义的结果,你需要在a中至少有一个虚拟方法,你需要在多态基类中有虚拟析构函数,以便销毁正确工作:

class A {
public:
  virtual ~A() {}
};

没有理由pA = pB;不工作,它应该工作,你说的"失败"是什么意思?

指针上强制转换是微不足道的,可以不使用动态强制转换。