С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Демультиплексор на С++ http://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.Найти количество нечетных элементов этой последовательности. http://www.cyberforum.ru/cpp-beginners/thread99864.html
C++ не компилируется
не компилируется этот код и не показывает какую нибуд ошибку #include <cstdlib> #include <iostream.h> void main(void) { cout << "Uchimsya programmirovat na yazyke С++!"; ...
Замена всех "не букв" на их 8-ое представление C++
Помогите с программой. Замены всех не букв во вводимой строке на их восьмеричное представление и вывода результата. есть похожая программа, там ..замена всех заглавных букв на их 8-ое...
C++ Нужна информация http://www.cyberforum.ru/cpp-beginners/thread99851.html
Ребят у меня такая проблема. Мне задали мою первую курсовую работу по программированию. Тема "Линейные программы С++". Необходимо теории 10-15 листов, а я по этой теме нахожу максимум 2 листа. Может...
C++ inline-объясните что такое 1.Перегрузка ф-ии-следует ли все функции перегрузить? 2.inline-объясните что такое 3.каким образом,если вызвать функции милионы раз,программа будет занимать все больше и больше в памяти? пока что... подробнее

Показать сообщение отдельно
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
13.05.2013, 21:41
Второе задание делается не так. Там надо создать робмовидную иерархию классов используя, очевидно, виртуальное наследование.

Можно, например, так.
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
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.