С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 17.06.2014
Сообщений: 119
1

Как избежать дублирования кода при использовании virtual функций?

22.04.2017, 23:02. Показов 1594. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Есть Класс Студент_А и Студент_Б. В каждом есть поле private содержащее string name. В классе Студент_А есть virtual метод, который выводит строку name. Класс Б наследует класс А. Хочу чтобы вывело name студента Б. Как это сделать, чтобы не приходилось в cpp файле дважды писать реализацию методов?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Student_A{
private:
string name = "Student A";
public:
virtual void print(){ cout<<name<<endl;
};
 
class Student_B : public Student_A{
private:
string name = "Student_B";
};
 
//где-то в main
Student_A obj = new Student_B();
obj.print();
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2017, 23:02
Ответы с готовыми решениями:

Как избежать дублирования кода?
Приветствую Вас уважаемые форумчане! Хочу обратиться к Вам за помощью. Возникли огромные пробелы...

Как избежать дублирования кода в Си
Допустим, есть такие структуры данных: enum Color{ Red, Blue, Black, White };...

Как избежать дублирования кода? Наследование
Здравствуйте. У меня следующая проблема: Есть несколько классов: A, B, C. Они наследуются от...

Избежать дублирования кода
Доброго времени суток, имеется метод записи данных. Записываю из Dictionary, проблема в том, что...

6
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
22.04.2017, 23:09 2
Вам имя типа напечатать что ли?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
#include<typeinfo>
class Parent
{
public:
    virtual~Parent(){}
};
 
class Child:public Parent
{
public:
    int x;
};
 
int main()
{
    Parent*p=new Child;
    std::cout<<typeid(*p).name()<<std::endl;
}
0
0 / 0 / 0
Регистрация: 17.06.2014
Сообщений: 119
22.04.2017, 23:21  [ТС] 3
Мне нужно вызвать метод print класса A, чтобы оно напечатало имя класса B. Можно ли это сделать не добавляя в функцию print аргументы ?

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Student_A{
private:
string name = "Student A";
public:
virtual void print(){ cout<<name<<endl;}
};
 
class Student_B : public Student_A{
private:
string name = "Student_B";
public:
 void print(){ cout<<name<<endl;} // я могу сделать вот так, но получиться дублирование кода (!!!!!!!!!!!!!!!!!!)
};
 
//где-то в main
Student_A obj = new Student_B();
obj.print();
0
1405 / 647 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
22.04.2017, 23:25 4
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
#include <iostream>
#include <string>
 
using namespace std;
 
class Student_A {
protected:
    string name = "Student A";
public:
    virtual void print() {
        cout << name << endl;
    }
};
 
class Student_B : public Student_A {
public:
    Student_B() { name = "Student B"; }
};
 
int main()
{
    Student_A* obj = new Student_B();
    obj->print();
    Student_A* obj1 = new Student_A();
    obj1->print();
    cin.get();
}
0
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 876
Записей в блоге: 10
23.04.2017, 01:26 5
Nikita07, Вы поучили ответ на Ваш вопрос?

Не по теме:

Dani

Цитата Сообщение от Dani Посмотреть сообщение
In C++14 you just write "auto auto(auto auto) { auto; }"
The compiler infers the rest from context.
Ехал грека через реку,
Видит грека, в реке грека...
?



Добавлено через 7 минут
Цитата Сообщение от Nikita07 Посмотреть сообщение
Есть Класс Студент_А и Студент_Б. В каждом есть поле private содержащее string name.
В таком случае в Студент_Б::name в Студент_Б перекрывает Студент_А::name. Я бы сказал, что это не лучшее проектирование.

Dani, для меня открытие, что в сях можно писать:
C++
1
2
protected:
    string name = "Student A";
Где выполняется этот оператор присваивания? В конструкторе класса? Перед ним?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
23.04.2017, 03:07 6
Цитата Сообщение от GoldenId Посмотреть сообщение
Dani, для меня открытие, что в сях можно писать:
С C++11 можно. Выполняется в любом конструкторе, если там эта инициализация не перекрыта явным name("bla-bla-bla").
0
142 / 143 / 64
Регистрация: 11.11.2010
Сообщений: 876
Записей в блоге: 10
23.04.2017, 03:27 7
Цитата Сообщение от Renji Посмотреть сообщение
С C++11 можно. Выполняется в любом конструкторе, если там эта инициализация не перекрыта явным name("bla-bla-bla").
Вона чо... А это не противоречит никаким фундаментальнейшим постулатищам ООП?
0
23.04.2017, 03:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2017, 03:27
Помогаю со студенческими работами здесь

Как избежать дублирования данных в текстовом поле при вставке в mysql таблицу
Как избежать дублирования данных в текстовом поле при вставке в mysql таблицу?? Помогите...

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

Как избежать дублирования сообщений ?
В гостевой книге или в форуме. Заполняешь форму отсылаешь, и вдруг взбрело в голову обновить...

Как избежать дублирования записей?
Вопрос, наверное, совсем идиотский, но я новичок, уж простите. Создал в MS SQL таблицу Owners с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru