我尝试了以下代码示例,但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;
}
答案 0 :(得分:2)
因为表达式c
具有类型C*
,而不是C
,这是转换运算符被调用所必需的。 C*
和A*
是不相关的类型,它们之间不存在转换。
A* aa = *c;
会起作用。
A* a = b;
有效,因为从指向派生类的指针转换为指向基类的指针是合法且隐式的(请注意,它不会调用转换运算符)。
答案 1 :(得分:1)
未调用转换运算符,因为没有适合的。
实际上,不能是一个合适的,因为你试图从指向一种类型的指针指向一个指向另一种非基本类型的指针。
如果您至少有一个用户定义的类型,但是参数是一个指针,因此不是用户定义的类型,并且结果(转换运算符是唯一一个结果是匹配的)也不是。
答案 2 :(得分:1)
您需要执行以下操作:
A *aa = *c;
这相当于:
A *aa = c->operator A*();
另一方面,A* a = b;
是upcasting的一个例子,它隐含在C ++和许多其他语言中。
请注意,您已为类B和类C定义了运算符,而不是指向这些类的指针。
学习:没有隐式转换为不相关类型的指针。
答案 3 :(得分:0)
指针只能指向其自己的类的对象,或指向派生类型的对象。由于C不从A继承,因此您的代码将无效。
我强烈建议您查看“21天内的C ++”(在线搜索),指针和参考部分。