Для начала, эти элементы данных
int yearBuilt;
string nameOfShip;
должны иметь защищенный спецификатор доступа вместо publi c.
В этом конструкторе
Ship(int year, string name) {
Ship::yearBuilt = year;
Ship::nameOfShip = name;
year = 0;
name = "";
}
последний два утверждения избыточны и не имеют смысла. Определите конструктор, например,
Ship( int year, const string &name ) : yearBuilt( year ), nameOfShip( name )
{
}
. Лучше определить эти геттеры
// Accessor Function for the year the ship was built
int getYearBuilt() const {
return yearBuilt;
}
// Accessor Function for the name of the ship
string getShipName() const {
return nameOfShip;
}
как
// Accessor Function for the year the ship was built
const int & getYearBuilt() const {
return yearBuilt;
}
// Accessor Function for the name of the ship
const string & getShipName() const {
return nameOfShip;
}
Эти сеттеры не имеют смысла. Например, аргументы не используются. Более того, вы пытаетесь переназначить аргументы с элементами данных.
// Mutator Function to read input and set it to the value of yearBuilt
void setShipYear(int year) {
cout << " Enter Year: " << endl;
cin >> year;
year = yearBuilt;
cout << endl; // Spacing between printed data
}
// Mutator Function to read input and set it to the value of nameOfShip
void setShipName(string name) {
cout << " Enter Name: " << endl;
cin >> name;
name = nameOfShip;
cout << endl; // Spacing between printed data
}
они должны быть определены как минимум как
// Mutator Function to read input and set it to the value of yearBuilt
void setShipYear(int year) {
yearBuilt = year;
}
// Mutator Function to read input and set it to the value of nameOfShip
void setShipName(string name) {
nameOfShip - name;
}
Этот конструктор
//Overloaded Constructor
CruiseShip(int maximum, int year, string name) : Ship() {
CruiseShip::passengersMAX = maximum;
}
не инициализировать элементы данных базового класса переданными аргументами. Он должен быть определен как
//Overloaded Constructor
CruiseShip(int maximum, int year, const string &name) : Ship(year, name ), passengersMAX( maximum )
{
}
Этот установщик
//Mutator
void setMaxPass(int maximum) {
cout << "Enter Passenger Max: " << endl;
cin >> maximum;
maximum = passengersMAX;
}
должен быть определен как
//Mutator
void setMaxPass(int maximum) {
passengersMAX = maximum;
}
Этот конструктор
CargoShip(int tonnage, string name) : Ship() {
CargoShip::capacity = tonnage;
}
делает не инициализировать с аргументом подобъект базового класса. Более того, член данных yearBuilt не имеет соответствующего аргумента.
Таким образом, по крайней мере, конструктор должен быть определен как
CargoShip(int tonnage, string name) : Ship( 0, name ), capacity( tonnage )
{
}
Этот метод установки
//Mutator Function
void setCapacity(int tonnage) {
cout << " Enter max capacity: " << endl;
cin >> tonnage;
tonnage = capacity;
}
должен быть определен например,
//Mutator Function
void setCapacity(int tonnage) {
capacity = tonnage;
}
В этом объявлении
CruiseShip *csPoint = static_cast<CruiseShip*>(shipArray[1]);
//...
CargoShip *cgPoint = static_cast<CargoShip*>(shipArray[2]);
вы должны использовать reinterpret_cast
CruiseShip *csPoint = reinterpret_cast<CruiseShip*>(shipArray[1]);
//...
CargoShip *cgPoint = reinterpret_cast<CargoShip*>(shipArray[2]);