У меня есть следующая тестовая программа (демонстрирует, чего я действительно пытаюсь достичь).
Кто-нибудь знает, возможно ли следующее без 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 *'
Нет, это невозможно, потому что B
это не A
, Вам либо нужно использовать наследование, чтобы сделать B
подкласс A
(так что B
является A
), или используйте композицию, а затем обратитесь к соответствующему подобъекту.
Нет, нельзя сделать эту строку ошибкой, потому что в вашем примере B*
а также A*
не являются неявно конвертируемыми.
Они были бы, если бы они были в той же иерархии наследования в правильном порядке, или если A
был typedef для void
, Теперь типы не связаны, и языковые правила запрещают неявные преобразования между такими не связанными типами указателей.
Указатели не могут быть разыграны. Даже если там определены операторы = функция. Это работает только на соответствующие объекты, а не на их указатель.
как это:
A *c;
*c = b; //or
c->operator=(b);