Можно ли предположить, что статическое приведение классов-братьев не будет компилироваться? - PullRequest
0 голосов
/ 05 июня 2019

Предположим, у меня в C ++ следующий шаблон:

class A {};

class B : public A {};

class C : public A {};

Это, очевидно, должно работать (приведение типов к родителю):

A a;
B b;

a = static_cast<A>(b);
a = static_cast<A>(c);

Они должны работать во время компиляции, но могут вызвать проблемы во время выполнения:

b = static_cast<B>(a);
c = static_cast<C>(a);

Могу ли я предположить, что это никогда не пройдет проверку компиляции (при условии, что не существует конструктора, который преобразует один класс в другой)?

b = static_cast<B>(c);
c = static_cast<C>(b);

1 Ответ

1 голос
/ 05 июня 2019

Чтобы использовать правильный полиморфизм, вы должны работать с указателями.

Здесь вы просто вызываете A::operator=(const A&).Начиная с этого у вас будет 3 стандартных оператора присваивания:

A::operator=(const A&)
B::operator=(const B&)
C::operator=(const C&)

B is-a A и C is-a A, поэтому вам не нужно static_cast в ваших первых двух заданиях.Использование актерского состава изменит способ выполнения задания.С использованием приведения объект будет разрезан на экземпляр A путем вызова A::A(const A&), а затем назначен с помощью A::operator=(const A&), но без приведения будет вызываться только последний.

Другие ваши приведения не будут выполнены ни при каких обстоятельствах.случай, потому что static_cast будет искать преобразование между двумя типами, но, например, static_cast<B>(a) требует B::B(const A&), который не определен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...