Разработать три класса, которые следует связать между собой, используя наследование:
- класс
Product
, который имеет три элемент-данных —имя
,цена
ивес
товара (базовый класс для всех классов); - класс
Buy
, содержащий данные о количестве покупаемого товара в штуках, о цене за весь купленный товар и о весе товара (производный класс для классаProduct
и базовый класс для классаCheck
); - класс
Check
, не содержащий никаких элемент-данных. Данный класс должен выводить на экран информацию о товаре и о покупке ( производный класс для классаBuy
);
Для взаимодействия с данными классов разработать set-
и get
—методы. Все элемент-данные классов объявлять как private
.
Рисунок 1 — Наследование, работа супермаркета
// заголовочный файл базового класса Product для всех классов #ifndef PRODUCT_H #define PRODUCT_H class Product { private: char name[50]; // имя товара double price, // цена weight; // вес 1 ед. public: Product(); // конструктор void setName(const char *); // установить имя товара const char *getName() const; // возвратить имя товара void setPrice(const double &); // установить цену товара double getPrice() const; // возвратить цену товара void setWeight(const double &); // установить вес 1 ед. товара double getWeight() const; // возвратить вес 1 ед. товара }; #endif PRODUCT_H
Файл реализации базового класса Product.
#include "stdafx.h" #include "product.h" #include <cstring> // прототип strcpy() Product::Product() // конструктор : price(0.0), weight(0.0) { for (int counter = 0; counter < 50; counter++) name[counter] = '\0'; } void Product::setName(const char *name_product) // установить имя товара { strcpy(name, name_product); // имя товара копируем в элемент данных класса } const char *Product::getName() const // возвратить имя товара { return name; } void Product::setPrice(const double & pr) // установить стоимость 1 ед. товара { price = (pr >= 0 ? pr : 0); } double Product::getPrice() const // возвратить стоимость 1 ед. товара { return price; } void Product::setWeight(const double & wgh) // установить вес товара { weight = wgh; } double Product::getWeight() const { return weight; }
Каждый класс определён в двух файлах(заголовочный и исполняемый файлы). Далее показан заголовочный файл класса Buy, который является производным для класса Product.
// заголовочный фай производного класса Buy для класса Product #ifndef BUY_H #define BUY_H #include "product.h" class Buy : public Product // открытое наследование { private: int sum; // количество покупаемого товара в шт. double sum_price, // цена за весь купленный товар sum_weight; // общий вес public: Buy(); // конструктор void setSum(const int &); // установить количество покупаемого товара int getSum() const; // возвратить количество покупаемого товара double getSumPrice() const; // возвратить цену за весь купленный товар double getSumWeight() const; // возвратить общий вес покупки }; #endif BUY_H
Файл реализации производного класса Buy.
#include "stdafx.h" #include "buy.h" Buy::Buy() // конструктор : sum(0), sum_price(0.0), sum_weight(0.0) { // пустое тело конструктора } void Buy::setSum(const int &value) // установить количество покупаемого товара { sum = (value >= 0 ? value : 0); sum_price = sum * getPrice(); // получаем стоимость всего товара sum_weight = sum * getWeight(); // получаем общий вес покупаемого товара } int Buy::getSum() const // возвратить количество покупаемого товара { return sum; } double Buy::getSumPrice() const // возвратить цену за весь купленный товар { return sum_price; } double Buy::getSumWeight() const // возвратить общий вес покупки { return sum_weight; }
Заголовочный файл производного класса Check для класса Buy. Заметьте, что класс Check не имеет файла реализации, так как реализация его методов выполнена внутри класса. Это сделано для того, чтобы не создавать отдельный файл всего для двух простых методов.
// заголовочный файл производного класса Check для класса Buy #ifndef CHECK_H #define CHECK_H #include "buy.h" class Check : public Buy // открытое наследование { public: void printProductInfo() { cout << "Товар: " << getName() << endl; cout << "Цена: " << getPrice() << " грн\n"; cout << "Вес: " << getWeight() << " кг\n\n"; } void printBuyInfo() { cout << "Товара куплено: " << getSum() << " шт\n"; cout << "На сумму: " << getSumPrice() << " грн\n"; cout << "Общий вес: " << getSumWeight() << " кг\n\n"; } }; #endif CHECK_H
После определения всех классов, в главном исполняемом файле объявляем объект последнего созданного класса Check. Для этого, сначала подключим заголовочный файл данного класса, как показано в строке 7.
// supermarket.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include <iostream> using namespace std; #include "check.h" // заголовочный файл производного класса Check от класса Buy int main(int argc, char* argv[]) { setlocale(LC_ALL, "rus"); Check product; // создаём объект класса product.setName("\"Уральские\" пельмени"); // устанавливаем название продукта product.setPrice(12); // цена продукта product.setWeight(1); // вес product.setSum(30); // куплено шт. product.printProductInfo(); //чек продукта product.printBuyInfo(); // чек покупки system("pause"); return 0; }
Результат работы программы показан на рисунке 1.
Комментарии
Arthur
NaikoN
Не припоминаю, что бы на сайте где-то было написано, что такое «Наследование» :)
admin
Вы абсолютно правы, такой статьи еще нет, но скоро будет. Практика появилась раньше чем теория )