неявное преобразование указателя в c ++

У меня есть следующая тестовая программа (демонстрирует, чего я действительно пытаюсь достичь).

Кто-нибудь знает, возможно ли следующее без reinterpret_cast<>?

struct B;

struct A {
A() { }
A( const B &b) { }
A( const B *b) { }
A( B *b) { }

A* operator=(const B *b) { }
A* operator=(B *b) { }
};

struct B {
B() { }
B( const A &a) { }
B( const B * b) { }
B( B *b) { }

B* operator=(const A *a) { }
B* operator=(A *a) { }
};

int main(int argc, char *argv[])
{
A *a = new A();
B *b = new B();

A *c = b;

return 0;
}

Я пытался сделать все операторы преобразования, которые я мог, но я просто не могу получить

  A *c = b;

не жаловаться

error C2440: 'initializing' : cannot convert from 'B *' to 'A *'

2

Решение

Нет, это невозможно, потому что B это не A, Вам либо нужно использовать наследование, чтобы сделать B подкласс A (так что B является A), или используйте композицию, а затем обратитесь к соответствующему подобъекту.

4

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

Нет, нельзя сделать эту строку ошибкой, потому что в вашем примере B* а также A* не являются неявно конвертируемыми.

Они были бы, если бы они были в той же иерархии наследования в правильном порядке, или если A был typedef для void, Теперь типы не связаны, и языковые правила запрещают неявные преобразования между такими не связанными типами указателей.

1

Указатели не могут быть разыграны. Даже если там определены операторы = функция. Это работает только на соответствующие объекты, а не на их указатель.

как это:

A *c;
*c = b;  //or
c->operator=(b);
1
По вопросам рекламы [email protected]