-2

我对 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] ..\asdf\qwerty.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
4

3 回答 3

3

您的类定义中缺少分号。在 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此外,您应该声明as的析构函数virtual以避免潜在的内存泄漏。如果不这样做并尝试删除 的实例BA则会调用 的析构函数,但B不会调用 的析构函数,从而将所有分配的资源保留为B未释放。

于 2013-06-14T09:27:48.123 回答
1

;在类定义后缺少分号:

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

此外,dynamic_cast为了返回有意义的结果,您需要在 A 中至少有一个虚拟方法。您需要在多态基类中具有虚拟析构函数,以便销毁无论如何都能正常工作:

class A {
public:
  virtual ~A() {}
};
于 2013-06-14T09:26:04.213 回答
0

没有理由 pA = pB; 不工作,它应该工作,你所说的“失败”是什么意思?指针向上转换是微不足道的,可以在没有动态转换的情况下使用。

于 2013-06-14T09:21:55.573 回答