Используйте один метод класса, который реализует другие методы класса, а также его собственный - PullRequest
3 голосов
/ 11 марта 2011

Я программирую на C ++, и у меня есть 3 класса, которые наследуют друг от друга:

Hatchback -> Car -> Vehicle;

Я хочу напечатать атрибуты из каждого класса, используя метод void print(),

У каждого класса есть метод Print, который печатает свои собственные атрибуты.

void Vehicle::print()
{
   // Vehicle attributes
}

void Car::print()
{
   // Car attributes
}

void Hatchback::print()
{
   // Hatchback Attributes
}

Я создаю объект, который инициализирует ВСЕ атрибуты из ВСЕХ классов в одном конструкторе:

Hatchback hatchback("L880UCD", "Vauhall", "Corsa", 
                    "White", "None", "Car", "Hatchback", 
                    3, 5, "Manual", 3, 2, 1);

Проблема в том, чтоЯ хочу напечатать все атрибуты, используя один метод печати, поэтому при вызове

object.print();

он проходит через метод печати транспортного средства, затем метод печати Car, затем метод печати хэтчбека.

Я знаю, что МОГУТ распечатать все атрибуты из метода печати Хэтчбек, потому что все унаследовано.Если возможно, я бы хотел избежать печати всех трех данных классов в одном методе класса ... Я бы предпочел, чтобы каждый класс имел свои СОБСТВЕННЫЕ методы и функции!

Мало того, у меня МНОГО других классов, включаяАвтомобиль, автобус и грузовик, которые ВСЕ наследуют от автомобиля, и контейнер, танкер, бортовой, мотоцикл, транзитный ETC и т. Д., Которые ВСЕ наследуются от автомобиля, грузовика и автобуса.

Так что я не хочу писать Print Vehicle вкаждый нижний производный класс!

Если есть способ сделать это, я был бы очень признателен за ответ.

Я пытался использовать виртуальные функции, но пришел к выводу, что они простовыберите, какой метод использовать во время выполнения, а не объединяя функции печати. ​​

Спасибо за чтение!Извините, если это неопределенный вопрос или вопрос Нуба ... Я новичок в переполнении стека!:)

Ответы [ 3 ]

7 голосов
/ 11 марта 2011

Если вы спрашиваете, можете ли вы вызвать метод базового класса из производного класса, тогда да, вы можете:

void Vehicle::print() {
   std::cout << "Vehicle attributes" << std::endl;
}

void Car::print() {
   Vehicle::print();
   std::cout << "Car attributes" << std::endl;
}
3 голосов
/ 11 марта 2011

Хэтчбек :: print () вызывает Car :: print (), который затем может вызывать Vehicle :: Print ()

2 голосов
/ 11 марта 2011

В Car :: print () распечатайте атрибуты автомобиля и затем вызовите Vehicle :: print ().В Hatchback :: print () распечатайте атрибуты хэтчбека, затем вызовите Car :: print () И так далее

...