2013-12-03 4 views
0

У меня есть 2 класса. Базовый класс имеет функцию виртуального отображения и переменную типа shipname и дату. Функция display() в базовом классе печатает название судна. У производного класса есть переопределение отображения(), которое также печатает имя судна и переменную-член y.Вызов виртуальной функции в производном классе

void Ship::display(){ 
    cout << shipName << endl << manufactureDate < <endl; 
} 

void CruiseShip::display(){ 
    cout << shipName << maxNoOfPassengers << endl; 
} 

У меня есть цикл, который вызывает объект из базового класса и объекта из производного класса, но он выводит только одно имя корабля вместо два

Когда слово дисплея от производного класса Я, название судна является пустым , но когда я вызываю его из базового объекта, он возвращает свое значение.

void main(){ 
    Ship  sh; 
    CruiseShip cruShip; 
    CargoShip cargShip; 

    sh.setName("Monster"); 
    sh.setDate("11/11/2011"); 
    cruShip.setNoOfPassengers(10); 
    cargShip.setCapacity(1000); 
    /*Ship *x[3] = {&sh, &cruShip, &cargShip}; 
    for(int i=0;i<3;++i){ 
     x[i]->display(); 
    }*/ 
    cout<<sh.getName()<<endl; 
    cout<<cruShip.getName()<<endl; 
    cout<<cargShip.getName(); 

    system("pause"); 
} 

монстр показывает только от объекта ш

+0

Um. Возможно, вам нужно позвонить setName() на cruShip и cargShip? –

+1

Вы только установили имя на 'sh'. Какие имена вы ожидаете от других, и почему? –

+0

Когда я наследую от класса, я получаю его переменную, которая является ShipName, тогда я устанавливаю shipName в объекте sh, потерял ли это значение, когда я вызываю его из другого класса? – MohamedAbbas

ответ

1

Вы не устанавливая атрибуты вашего объекта cargShip. Вы задаете имя и дату объекта sh , но объект cargShip - это целый отдельный объект со своим именем и датой, которые вы еще не установили. Попробуйте:

cargShip.setName("Cargo Ship") 
cargShip.setCapacity(1000); 
+0

Когда я наследую от класса, я получаю его переменную, которая является shipName, тогда я устанавливаю shipName в объекте sh, потерял ли это значение, когда я вызываю его из другого класса. – MohamedAbbas

+1

Вы путаетесь в различии между классом и объектом. Вы можете иметь несколько объектов корабля. Что, если у вас есть «Ship sh; Корабль sh2; ' Затем вы можете вызвать' sh.setName («Ship1»); sh2.setName («Ship2»); 'Теперь у вас есть два разных корабля с двумя разными именами, даже если они имеют один и тот же класс. Точно так же sh и cargShip являются совершенно разными объектами и не разделяют ничего друг с другом. – hankd

+0

Для получения дополнительной информации см. Http://www.cplusplus.com/doc/tutorial/classes/. Удостоверьтесь, что вы понимаете эту статью и видите, помогает ли она ее устранять. – hankd

0

Прежде всего, это не ясно, каким образом определяются классы, инициализировать ли элементы данных базового класса в конструкторе производного класса или нет. Также я не вижу, что отображение функции объявлено как виртуальное.

Смежные вопросы