Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Демультиплексор на С++ https://www.cyberforum.ru/ cpp-beginners/ thread99872.html
Помогите мне вставить код демультиплексора в программу С++ и описать детально код. Помогите, очень прошу) { bool s0,s1,i; if (StrToInt(S0->Text)==1) s0=true; else s0=false; if...
C++ Дана последовательность целых чисел, за которой следует 0.Найти количество нечетных элементов этой последовательности.
Помогите пожалуйста написать программку!!!!!! Дана последовательность целых чисел, за которой следует 0.Найти количество нечетных элементов этой последовательности.
C++ не компилируется
не компилируется этот код и не показывает какую нибуд ошибку #include <cstdlib> #include <iostream.h> void main(void) { cout << "Uchimsya programmirovat na yazyke С++!"; ...
C++ Замена всех "не букв" на их 8-ое представление Помогите с программой. Замены всех не букв во вводимой строке на их восьмеричное представление и вывода результата. есть похожая программа, там ..замена всех заглавных букв на их 8-ое... https://www.cyberforum.ru/ cpp-beginners/ thread99855.html
C++ Нужна информация https://www.cyberforum.ru/ cpp-beginners/ thread99851.html
Ребят у меня такая проблема. Мне задали мою первую курсовую работу по программированию. Тема "Линейные программы С++". Необходимо теории 10-15 листов, а я по этой теме нахожу максимум 2 листа. Может...
C++ inline-объясните что такое
1.Перегрузка ф-ии-следует ли все функции перегрузить? 2.inline-объясните что такое 3.каким образом,если вызвать функции милионы раз,программа будет занимать все больше и больше в памяти? пока что...
C++ Подготовка к экзамену
У меня скоро экзамен по С++. Там задачи: 1. Вычислить сумму:2/3+3/4+4/5+...+10/11. 2. Найти сумму ряда 2+4+6+…20. 3. Даны 2 действительных числа х, у (Х "не равно" У). Меньшее из этих 2-х чисел...
C++ Как прописать консольную команду Не подскажете как в консольном приложениии С++ прописать консольную команду Windows XP и как добввить ключь в реестр? https://www.cyberforum.ru/ cpp-beginners/ thread99825.html
C++ Необходимо разработать программу генерации ПСП https://www.cyberforum.ru/ cpp-beginners/ thread99820.html
Прошу помочь. Кто учился на ЗС, ЗИ, Зм, в общем защитники инфы и те кто знаком с основами инф. Безопасности (криптографии) - Необходимо разработать программу генерации ПСП. Вид ГПСП: Пороговый...
C++ Найти сумму элементов последовательности Задана некоторая последовательность чисел: n(n-1)...(n-k)+(n-1)(n-2)...(n-k-1)+(k+1)k(k-1)...1 Как я понял задание, то вводя с клавиатуры значения n и k необходимо найти сумму элементов... https://www.cyberforum.ru/ cpp-beginners/ thread99808.html
3054 / 1459 / 492
Регистрация: 29.11.2010
Сообщений: 2,888
13.05.2013, 21:41 0

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов

13.05.2013, 21:41. Показов 9636. Ответов 5
Метки (Все метки)

Ответ

Второе задание делается не так. Там надо создать робмовидную иерархию классов используя, очевидно, виртуальное наследование.

Можно, например, так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <iostream>
#include <cstring>
 
/**
 * Виртуальный базовый класс.
 * Ничего лучше не придумал.
 */
class Printable {
 public:
  virtual void print(std::ostream &) const = 0;
};
 
class Human : virtual public Printable {
 public:
  Human() : name(0) {}
  Human(const char *name)
    : name(strcpy(new char[strlen(name) + 1], name)) {}
  Human(const Human &human)
    : name(strcpy(new char[strlen(name) + 1], human.getName())) {}
  Human &operator=(const Human &human) {
    if (this != &human) {
      setName(human.getName());
    }
    return *this;
  }
  virtual ~Human() {
    delete [] name;
  }
  void setName(const char *name) {
    delete [] this->name;
    this->name = strcpy(new char[strlen(name) + 1], name);
  }
  const char *getName() const { return name; }
  virtual void print(std::ostream &stream) const {
    stream << "Human{name='" << getName() << "'}";
  }
 private:
  char *name;
};
 
// виртуальное наследование
class Student : virtual public Human {
 public:
  Student() : Human(), institute(0) {}
  Student(const char *name, const char *institute) : Human(name),
    institute(strcpy(new char[strlen(institute) + 1], institute)) {}
  Student(const Student &s) : Human(s.getName()),
    institute(strcpy(new char[strlen(s.getInstitute()) + 1], s.getInstitute())) {}
  Student &operator=(const Student &s) {
    if (this != &s) {
      setName(s.getName());
      setInstitute(s.getInstitute());
    }
    return *this;
  }
  void setInstitute(const char *institute) {
    delete [] this->institute;
    this->institute = strcpy(new char[strlen(institute) + 1], institute);
  }
  const char *getInstitute() const { return institute; }
  virtual void print(std::ostream &stream) const {
    stream << "Student{name='" << getName() << "',"
      "institute='" << getInstitute() << "'}";
  }
 private:
  char *institute;
};
 
// виртуальное наследование
class Father : virtual public Human {
 public:
  Father() : Human(), numberOfChildren(1) {}
  Father(const char *name, int numberOfChildren) : Human(name), 
    numberOfChildren(numberOfChildren) {}
  int getNumberOfCildren() const { return numberOfChildren; }
  void setNumberOfChildren(int numberOfChildren) {
    this->numberOfChildren = numberOfChildren;
  }
  virtual void print(std::ostream &stream) const {
    stream << "Father{name='" << getName() << "',"
      "numberOfChildren=" << getNumberOfCildren() << "}";
  }
 private:
  int numberOfChildren;
};
 
class StudentFather : public Student, public Father {
 public:
  StudentFather() : Student(), Father() {}
  StudentFather(const char *name, const char *institute, int numberOfChildren)
    : Student(), Father() {
    setName(name);
    setInstitute(institute);
    setNumberOfChildren(numberOfChildren);
  }
  virtual void print(std::ostream &stream) const {
    stream << "StudentFather{name='" << getName() << "',"
      "institute=" << getInstitute() << "'," <<
      "numberOfChildren=" << getNumberOfCildren() << "}";
  }
};
 
// упрощение вывода на печать и демонстрация позднего связывания
// виртуального базового класса.
std::ostream &operator<<(std::ostream &stream, const Printable &p) {
  p.print(stream);
  return stream;
}
 
int main(int argc, char *argv[]) {
  Father f("Ivan", 2);
  Student s("Ivan", "MIT");
  StudentFather sf("Ivan", "MIT", 2);
  std::cout << f << std::endl << s << std::endl << sf << std::endl;
}
Добавлено через 5 минут
Забыл про конструктор копирования и оператор присваивания у производного класса. Добавьте сами.

Вернуться к обсуждению:
Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2013, 21:41

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

Шаблоны классов, перегрузка операторов, C2679
#include &lt;iostream&gt;//для std::cin, std::cout #include &lt;cstdio&gt; #include &lt;string&gt; #include...

Перегрузка операторов для наследованных классов
Есть один класс, для него определена операция сложения. Есть так же наследованный класс для него...

Перегрузка оператора = и +=, используя наследование классов
Есть 2 класса (Point и Rect). В классе Rect нужно перегрузить операцию = и += не нарушая правил...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.