2

我尝试了以下代码示例,但 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;
}
4

4 回答 4

2

因为 expressionc具有 type C*, not C,这是调用转换运算符所必需的。C*并且A*是不相关的类型,它们之间不存在转换。

A* aa = *c;

会工作。

A* a = b;之所以有效,是因为从派生类指针到基类指针的转换是合法且隐式的(请注意,它不调用转换运算符)。

于 2015-01-08T11:27:52.393 回答
1

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

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

如果您至少有一种用户定义类型,则只能覆盖运算符,但参数是指针,因此不是用户定义类型,并且结果(转换运算符是唯一匹配结果的类型) ) 也不是。

于 2015-01-08T11:28:05.087 回答
1

您需要执行以下操作:

A *aa = *c;

这相当于:

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

另一方面是在 C++ 和许多其他语言中隐式发生的向上转换A* a = b;的示例。

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

在此处查看现场演示

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

于 2015-01-08T11:28:19.067 回答
0

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

我强烈建议您看一下“21 天内的 C++”(在线搜索),指针和参考部分。

于 2015-01-08T11:28:13.893 回答