C — основная ошибка с массивами базовых классов

#c #arrays #inheritance #base-class

#c #массивы #наследование #базовый класс

Вопрос:

Сейчас я немного застрял. У меня есть базовый класс под названием BaseBond. ZeroCouponBond и CouponBond наследуются от этого класса. Я хочу создать массив, содержащий оба типа связей. Вот мой код:

 ...
BaseBond port[12];

for (int i=0; i < recordCount; i  )
{
    if (bonds[i].CouponRate == 0.0)
        port[i] = new ZeroCouponBond(bonds[i]);
    else
        port[i] = new CouponBond(bonds[i]);
}
  

Вот ошибка, которую я получаю:
ошибка: нет соответствия для ‘operator=’ в ‘port[i]

Я знаю, что это, вероятно, простое исправление и связано с тем, когда я могу объявлять объекты в массиве, но я относительно новичок в C и не знаю всех правил.

Заранее спасибо за помощь!

Ответ №1:

Вам нужно сделать это с помощью указателей:

Измените объявление на это:

 BaseBond *port[12];
  

В вашем исходном коде вы пытались назначить указатель на BaseBond . Поэтому он не будет компилироваться.

Кроме того, когда вы используете наследование подобным образом, вам все равно придется делать это с помощью указателей, чтобы предотвратить нарезку объектов.

Комментарии:

1. Спасибо, Мистик! Последний вопрос. Теперь, скажем, хотите получить доступ к методу класса CouponBond, как бы я это сделал? Я знаю, что порт массива теперь является массивом базовых связей. Я должен сначала использовать его как CouponBond, чтобы получить доступ к его методам, верно? Что не так с этим кодом: port[i] = new CouponBond(связи [i]); printf(«P: %f», ((CouponBond)порт[i])->getPrice());

2. Если этот метод специфичен для CouponBond класса, то вы действительно не можете этого сделать. Таким образом, вам придется использовать его — хотя на этом этапе вам придется более тщательно подумать о том, правильно ли вы его спроектировали. В идеале, этот метод находится в BaseBond классе и переопределяется каждым из подклассов.

3. Я только что видел редактирование вашего комментария. В этом случае вы должны определить getPrice метод в BaseBond классе и сделать его виртуальным. (это имеет смысл, поскольку getPrice применяется ко всем «связям») Затем вы можете переопределить ее с помощью версии, специфичной для CouponBond .