上行指针

时间:2013-06-14 09:11:48

标签: c++ pointers upcasting

我对使用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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您在课程定义后缺少分号;

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

同样,对于dynamic_cast返回有意义的结果,您需要在A中至少有一个虚拟方法。您需要在多态基类中使用虚拟析构函数,以便销毁才能正常工作:

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

答案 2 :(得分:1)

您的类定义中缺少分号。 C ++中的Upcast完全合法,可以隐式方式完成(多态)。这对我有用:

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不同意。