C++指针的投射运算符
C++ cast operator of pointer
我尝试了以下代码示例,但 A* aa = c; 无法编译。为什么不调用转换运算符?没有指针的相同示例有效。所以我不知道为什么C必须继承A?感谢您的帮助。
编辑:我知道编码这样的东西是没有意义的。但我只是想了解转换的东西。
#include <iostream>
using namespace std;
class A {
public:
int mValue = 0;
};
class B : public A{
public:
operator A*() {
return this;
}
};
class C {
public:
operator A*() {
return new A();
}
};
int main(int argc, char* argv[])
{
B* b = new B();
A* a = b;
C* c = new C();
A* aa = c;
}
因为表达式c
的类型是C*
,而不是C
,这是调用转换运算符所必需的。 C*
和 A*
是不相关的类型,它们之间不存在转换。
A* aa = *c;
会工作。
A* a = b;
工作是因为从指向派生类的指针到指向基类的指针的转换是合法且隐式的(请注意,它不调用转换运算符)。
不调用转换运算符,因为没有合适的运算符。
实际上,不可能有一个合适的类型,因为您正在尝试从指向一种类型的指针分配给指向另一种非基类型的指针。
仅当至少有一个用户定义类型时,才能重写运算符,但参数是指针,因此不是用户定义类型,并且结果(转换运算符是唯一与结果匹配的运算符)也不是。
您需要执行以下操作:
A *aa = *c;
这相当于:
A *aa = c->operator A*();
另一方面A* a = b;
是C++和许多其他语言中隐含发生的向上转换的一个例子。
请注意,您已经为 B 类和 C 类定义了运算符,而不是指向这些类的指针。
在此处查看现场演示
学习:没有隐式转换为不相关类型的指针。
指针
只能指向其自己类的对象或派生类型的对象。由于 C 不是从 A 继承的,因此您的代码将不起作用。
我强烈建议您查看"21天内C++"(在线搜索),指针和参考部分。
相关文章:
- C++ 带有函数指针的运算符优先级
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- 在一个指令中声明更多指针的运算符优先级
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- SFINAE - 检测类型 T 是指针、数组还是带有随机访问运算符的容器,以及给定的值类型
- c++:复制、删除和运算符=在原始指针映射中
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 类重载运算符 '<' 插入指向该对象集的共享指针时不调用
- 使用继承的指针列表复制构造函数或重载运算符=
- delete运算符如何处理c中的指针
- 为指针重载运算符++
- 在分配指向数组内存地址的指针时,为什么不必使用地址运算符?
- 如何从模板类重载创建的指针对象上的运算符?
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 为什么运算符"new"需要指针才能工作?
- C++运算符指针,乘法
- 运算符指针数组的新语法
- 重载运算符(指针)