Преобразование многомерного массива в многомерный массив его суперкласса в c ++

0

так что мой вопрос в том, почему это не разрешено, в этом случае бросить B *** в ***? Когда я вручную отбрасываю arr (A **), этот код работает нормально.

static const int N = 2;

class A {
public:
    virtual ~A() {
    }
    virtual void bla() {
        cout << 'A' << endl;
    }
};

class B: public A {
public:
    ~B() {
    }
    void bla() {
        cout << 'B' << endl;
    }
};

void callBla(A** arr) {
    for (int i = 0; i < N; i++) {
        arr[i]->bla();
    }
}

int main() {
    B** arr = new B*[N];
    for (int i = 0; i < N; i++) {
        arr[i] = new B[N];
    }
    callBla(arr);
    return 0;
}

Я ничего не мог найти об этом случае, спасибо за ваши ответы заранее!

  • 0
    Почему бы не использовать векторы? Тогда ваш код не пропускает память.
  • 0
    эй, да, спасибо, это действительно утечка памяти действительно: P
Теги:
multidimensional-array
casting

1 ответ

0
Лучший ответ

Это не типично; вы могли бы сделать

void callBla(A** arr) {
    for (int i = 0; i < N; i++) {
        arr[i] = new A;
    }
}

и тогда ваш массив B* больше не будет массивом B*.

или даже

void callBla(A** arr) {
    for (int i = 0; i < N; i++) {
        *arr[i] = A();
    }
}

и тогда ни один из ваших B не будет B больше.

  • 0
    Эй, спасибо, поможет ли в этом случае добавление const?
  • 0
    @ user3277430 Нет. Указатель на указатель на производное никогда не может быть преобразован в указатель на указатель на базу, никогда.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню