#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
.