我对使用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
答案 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
不同意。