指针的 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; 之所以有效,是因为从指向派生 class 的指针到指向基 class 的指针的转换是合法且隐式的(请注意,它不会调用转换运算符) .

没有调用转换运算符,因为没有合适的

实际上,不可能合适,因为您正试图将指向一种类型的指针分配给指向另一种非基本类型的指针。

如果您至少有一个用户定义类型,则只能重写运算符,但参数是指针,因此不是用户定义类型,而结果(转换运算符是唯一的)结果匹配的地方)也不是。

指针只能指向它自己的对象 class,或指向派生类型的对象。由于 C 不继承自 A,因此您的代码将无法运行。

我强烈建议您查看 "C++ in 21 days"(在线搜索),指针和参考部分。

您需要执行以下操作:

A *aa = *c;

相当于:

A *aa = c->operator A*();

另一方面,A* a = b;upcasting 的一个例子,它在 C++ 和许多其他语言中隐式发生。

请注意,您已经为 class B 和 class C 定义了运算符,而不是为指向这些 classes 的指针定义运算符。

Check live demo here

学习:不存在到不相关类型指针的隐式转换。