приведение — C ++ оператор приведения указателя

Я попробовал следующий пример кода, но 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;
}

2

Решение

Потому что выражение c имеет тип C*не C, который требуется для вызова оператора преобразования. C* а также A* являются несвязанными типами, и между ними нет преобразования.

A* aa = *c;

должно сработать.

A* a = b; работает, потому что преобразование из указателя на производный класс в указатель на базовый класс является законным и неявным (имейте в виду, что он не вызывает оператор преобразования).

2

Другие решения

Оператор преобразования не вызывается, потому что нет подходящего.

На самом деле, там не может быть подходящий, так как вы пытаетесь присвоить указатель одного типа указателю другого неосновного типа.

Вы можете переопределить операторы, только если у вас есть хотя бы один определенный пользователем тип, но аргумент является указателем, а, следовательно, не определяемым пользователем типом, а результатом (оператор преобразования является единственным, для которого результат соответствует ) тоже нет.

1

Вам нужно сделать следующее:

A *aa = *c;

что будет эквивалентно:

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

С другой стороны A* a = b; это пример приведение к базовому типу что неявно происходит в C ++ и многих других языках.

Обратите внимание, что вы определили оператор для класса B и класса C, а не для указателей на эти классы.

Проверьте демо здесь

Усвоение: Не существует неявного преобразования в указатели не связанных типов.

1

Указатель может указывать только на объекты своего класса или на объекты производного типа. Поскольку C не наследуется от A, ваш код не будет работать.

Я настоятельно рекомендую вам взглянуть на «C ++ за 21 день» (поиск в Интернете), раздел указателей и ссылок.

0