【问题标题】:C++ - Basic Error with Arrays of Base ClassesC++ - 基类数组的基本错误
【发布时间】:2011-10-14 18:42:23
【问题描述】:

我现在有点卡住了。我有一个名为 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]);
}

这是我得到的错误: 错误:‘port[i] 中的‘operator=’不匹配

我知道这可能是一个简单的解决方法,并且与我何时可以在数组中声明对象有关,但我对 C++ 比较陌生,不知道所有规则。

提前感谢您的帮助!

【问题讨论】:

    标签: c++ arrays inheritance base-class


    【解决方案1】:

    您需要使用指针来执行此操作:

    将声明更改为:

    BaseBond *port[12];
    

    在您的原始代码中,您试图分配一个指向BaseBond 的指针。所以它不会编译。

    此外,当您像这样使用继承时,无论如何都必须使用指针来防止对象切片。

    【讨论】:

    • 谢谢神秘!最后一个问题。现在说想要访问 CouponBond 类的方法,我该怎么做呢?我知道阵列端口现在是 BaseBonds 阵列。我必须先将其转换为 CouponBond 才能访问其方法,对吗?这段代码有什么问题:port[i] = new CouponBond(bonds[i]); printf("P: %f", ((CouponBond)port[i])->getPrice());
    • 如果该方法是特定于CouponBond 类的,那么你就不能真正做到这一点。所以你必须铸造它——尽管在这一点上你必须更仔细地考虑你是否正确地设计了它。理想情况下,该方法位于BaseBond 类中,并被每个子类覆盖。
    • 我刚刚看到你的评论编辑。在这种情况下,您应该在BaseBond 类中定义getPrice 方法并将其设为虚拟。 (这是有道理的,因为getPrice 适用于所有“债券”)然后您可以使用特定于CouponBond 的版本覆盖它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多