#c
#c
Вопрос:
using namespace std;
class A {
public:
virtual int r();
};
class B : public A {
public:
int r() { return 1; }
};
class C : public A {
public:
int r() { return 2;}
};
int main(int argc, char ** argv) {
B b;
C c;
A amp;a = argc > 1 ? b : c;
return a.r();
}
с ошибками:
#g a.cc
a.cc: In function ‘int main(int, char**)’:
a.cc:20:18: error: operands to ‘?:’ have different types ‘B’ and ‘C’
20 | A amp;a = argc > 1 ? b : c;
| ~~~~~~~~~^~~~~~~
Как я могу исправить это, чтобы привязать ссылку к любому из двух объектов?
Комментарии:
1. Троичный оператор (
?:
) требует, чтобы один из двух возможных результатов (b
иc
) мог быть преобразован в тип другого. Ни один из классовB
иC
(или ссылок на них) не может быть неявно преобразован в другой. Тот факт, что оба они происходят изA
, этого не меняет. Вам нужно изменить выражение, чтобы один из возможных результатов мог быть преобразован в тип другого.2. @Peter «для возможности преобразования» -> «для возможности статического преобразования» Если я правильно помню, условный оператор Python требует только, чтобы типы были связаны динамически.
Ответ №1:
Просто так работает язык, вот и все. Обратите внимание, что вы не можете static_cast
перейти от a B
к a C
(или наоборот), что, неофициально говоря, требуется для типов ветвления троичного условного оператора.
Вам нужно написать что-то вроде
A amp;a = argc > 1 ? static_cast<Aamp;>(b) : static_cast<Aamp;>(c);
Комментарии:
1. Если это заставляет вас чувствовать себя менее стесненным, я ненавижу оба: P
2. Чат был не со мной.
3. В качестве примечания, требуется только одно приведение (либо для
b
илиc
), даже если я нахожу, что это более понятно с обоими.4. могу ли я динамично создавать b или c вместо того, чтобы создавать их все? если использовать только выделение стека