我尝试了以下代码示例,但 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++"(在线搜索),指针和参考部分。