向上转型指针
Upcasting pointers
我对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;不工作,它应该工作,你说的"失败"是什么意思?
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- 向上转型指针