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
相关产品推荐
相关产品推荐

