You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++数组元素赋值函数及船舶类多态数组作业实现问询

嘿,我来帮你搞定这两个问题——先讲数组元素赋值的方法,再把你那道作业题的完整实现给你理清楚~

在C++中给数组元素赋值的几种方式

不管是普通数据类型数组还是类对象数组,都有几种常用的赋值方法:

  • 初始化时直接赋值:如果是静态数组,定义的时候就能直接给元素赋值,比如int nums[3] = {10,20,30};,类对象的话也可以这样:Ship ships[2] = {Ship("A", "2000"), Ship("B", "2010")};
  • 循环逐个赋值:用for或者while循环遍历数组下标,给每个元素单独赋值,适合需要动态生成值的场景
  • 用函数批量赋值:写一个专门的函数来处理赋值逻辑,把数组(或数组指针)和长度传进去,在函数里完成赋值。比如给int数组赋值的函数:
void fillIntArray(int arr[], int length) {
    for(int i=0; i<length; i++) {
        arr[i] = i * 5; // 每个元素是下标的5倍
    }
}

调用的时候直接传数组名和长度就行:fillIntArray(myArr, 5);

你的作业题完整实现(类的多态+数组遍历)

你的作业核心是用多态来实现不同船类的printInfo调用,因为Ship是基类,CruiseShip和CargoShip是派生类,必须用基类指针数组才能保存不同派生类的对象,避免切片问题。下面是完整的可运行代码:

首先定义三个类:

#include <iostream>
#include <string>
using namespace std;

// 基类:Ship
class Ship {
protected:
    string shipName;
    string builtYear;
public:
    // 构造函数
    Ship(string name, string year) : shipName(name), builtYear(year) {}

    // 虚函数:必须声明为虚函数才能让派生类重写后实现多态
    virtual void printInfo() {
        cout << "Ship Name: " << shipName << endl;
        cout << "Year Built: " << builtYear << endl;
    }

    // 虚析构函数:避免内存泄漏(如果有动态分配的成员的话)
    virtual ~Ship() {}
};

// 派生类:CruiseShip(游轮)
class CruiseShip : public Ship {
private:
    int maxPassengerCount;
public:
    CruiseShip(string name, string year, int maxPassengers) 
        : Ship(name, year), maxPassengerCount(maxPassengers) {}

    // 重写printInfo方法,只打印游轮关心的信息
    void printInfo() override {
        cout << "Cruise Ship Name: " << shipName << endl;
        cout << "Maximum Passengers: " << maxPassengerCount << endl;
    }
};

// 派生类:CargoShip(货船)
class CargoShip : public Ship {
private:
    int cargoCapacityTons;
public:
    CargoShip(string name, string year, int capacity) 
        : Ship(name, year), cargoCapacityTons(capacity) {}

    // 重写printInfo方法,只打印货船关心的信息
    void printInfo() override {
        cout << "Cargo Ship Name: " << shipName << endl;
        cout << "Cargo Capacity (tons): " << cargoCapacityTons << endl;
    }
};

然后是主函数部分,创建数组、赋值、遍历调用:

int main() {
    const int TOTAL_SHIPS = 3;
    // 定义基类指针数组,这样可以存储不同派生类的对象地址
    Ship* shipArray[TOTAL_SHIPS];

    // 给数组元素赋值:分别指向Ship、CruiseShip、CargoShip的对象
    shipArray[0] = new Ship("Titanic", "1912");
    shipArray[1] = new CruiseShip("Wonder of the Seas", "2022", 6988);
    shipArray[2] = new CargoShip("Ever Ace", "2021", 23992);

    // 遍历数组,调用每个对象的printInfo方法
    cout << "=== All Ship Details ===" << endl;
    for(int i=0; i<TOTAL_SHIPS; i++) {
        cout << "\nShip " << (i+1) << ":" << endl;
        shipArray[i]->printInfo(); // 多态调用,自动匹配对应类的方法
    }

    // 释放动态分配的内存,避免泄漏
    for(int i=0; i<TOTAL_SHIPS; i++) {
        delete shipArray[i];
    }

    return 0;
}

关键知识点说明:

  • 基类指针数组:如果直接用Ship shipArray[TOTAL_SHIPS],赋值派生类对象会发生“对象切片”,只能保留基类部分的内容,无法调用派生类的printInfo。用指针数组就可以存储不同派生类对象的地址,实现多态。
  • 虚函数+override:把基类的printInfo声明为virtual,派生类用override重写,这样通过基类指针调用时,会根据实际指向的对象类型调用对应的方法。
  • 内存释放:因为用了new创建对象,所以最后必须用delete释放每个指针指向的内存,避免内存泄漏。

如果想把数组赋值的逻辑单独抽成函数,也可以这样写:

void populateShipArray(Ship* arr[], int size) {
    arr[0] = new Ship("Titanic", "1912");
    arr[1] = new CruiseShip("Wonder of the Seas", "2022", 6988);
    arr[2] = new CargoShip("Ever Ace", "2021", 23992);
    // 如果size大于3,可以继续添加更多对象
}

然后在main里调用populateShipArray(shipArray, TOTAL_SHIPS);就行。

内容的提问来源于stack exchange,提问作者Chase Burleson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:18:55