условное выражение c присваивает ссылку

#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 вместо того, чтобы создавать их все? если использовать только выделение стека