С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
1

Назначить каждому классу свое одноименное поле

03.04.2016, 19:00. Показов 750. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как сделать, что бы у каждого класса поля в дереве наследования было свое значение?
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
    int n = 100;
};
 
class B : public A
{
public:
    int n = 200;
};
C++
1
2
3
4
5
6
7
int main()
{
    A* b = new B;
    std::cout << b->n;//100, а нужно что бы было 200
 
    return 0;
}
В функции main как комментарий описал нужное. Думал, может поле можно сделать виртуальным как это делается для функций в таких задачах, но компилятор отказался это принимать.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2016, 19:00
Ответы с готовыми решениями:

Каждому li элементу назначить свое изображение
Здравствуйте! Как лучше реализовать такое? Пример: &lt;div id=&quot;content-ui&quot;&gt; &lt;p&gt;НАШИ...

Как назначить атрибут Serializable чужому классу?
Привет! Есть 3 сборки: 1. Фреймворк, который работает с классами, помеченными атрибутом...

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

TreeView: назначить Tag каждому ноду
Строю treeview из xml файла. Интересуют только вложенные элементы. В моём случае вложенный элемент...

8
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.04.2016, 19:02 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct A 
{ 
    virtual ~A(){}
    int n = 100; 
};
 
struct B : A
{
    B(){ this->n=200; }
};
 
int main()
{
    A* b = new B;
    std::cout << b->n;
}
1
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
03.04.2016, 19:12  [ТС] 3
hoggy,
Спасибо за пример, но это "альтернативный" вариант. Есть ли способ что бы без подобных телодвижений было выведено значение по умолчанию поля производного класса? Как с виртуальными функциями, но только для полей?
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.04.2016, 19:14 4
Цитата Сообщение от sys_beginner Посмотреть сообщение
Есть ли способ что бы без подобных телодвижений было выведено значение по умолчанию поля производного класса? Как с виртуальными функциями, но только для полей?
нет.
1
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
03.04.2016, 19:25  [ТС] 5
hoggy,
Ясно. Спасибо
0
Модератор
Эксперт С++
13706 / 10909 / 6473
Регистрация: 18.12.2011
Сообщений: 29,126
03.04.2016, 19:27 6
А чем виртуальный механизм не устраивает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
{
    int n;
public:
    A():n(100){}
    virtual int get(){return n;}
};
 
class B : public A
{
    int n;
public:
    B():n(200){}
    virtual int get(){return n;}
};
int main()
{
    A* b = new B;
    std::cout << b->get();
 
    return 0;
}
0
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
03.04.2016, 19:37  [ТС] 7
zss,
Дело не в "устраивает", просто изучаю язык, синтаксис, его возможности

Добавлено через 7 минут
zss,
С другой стороны, в вашем примере продублирован метод get(), согласитесь это лишнее и было бы отлично иметь под рукой механизм виртуальных полей. Тогда и get() не пришлось бы дублировать
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.04.2016, 19:48 8
Цитата Сообщение от sys_beginner Посмотреть сообщение
согласитесь это лишнее и было бы отлично иметь под рукой механизм виртуальных полей. Тогда и get() не пришлось бы дублировать
на практике нет необходимости в виртуальных полях.
зато есть серьёзные основания делать все данные-члены закрытыми.
доступ к внутренностям класса только через публичный интерфейс
(public методы класса).
0
245 / 139 / 53
Регистрация: 23.11.2015
Сообщений: 394
06.04.2016, 10:39 9
sys_beginner, недавно понадобилось сделать что-то похожее. решил отписать, чтобы потом мог ссылаться на этот ответ.

хотелось, чтобы суперкласс задавал дефолтное значение, а наследники при конструировании могли задать любое другое. подразумевается, что такое поле не должно вообще изменяться извне, а доступ происходит через геттер. используется делигирующий конструктор, что, конечно, не обязательно. поля и методы не дублируются.
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
#include <iostream>
 
class A
{
protected:
    int n;
public:
    A(int n_) : n(n_) {}
    A() : A(100) {}
 
    int getN() const { return n; }
};
 
class B : public A
{
public:
    B() : A(200) {}
};
 
int main()
{
    A* b = new B;
    std::cout << b->getN() << std::endl;
 
    return 0;
}
0
06.04.2016, 10:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2016, 10:39
Помогаю со студенческими работами здесь

Определить средний балл по каждому классу
Даны списки учащихся 9А и 9Б классов и результаты предварительного экзамена по математике....

Назначить каждому потоку на каком ядре процессора работать
как на с# назначить каждому потоку на каком процессоре ему работать если в системе 4 проца

Каждому определённому символу в слове назначить цифру и посчитать их сумму
Не могу найти ошибку, в джаве новичок, помогите пожалуйста или подскажите где искать ошибку! Надо...

Как каждому объекту класса из списка назначить свою процедуру?
как каждому объекту класса в списке назначить свою процедуру при заполнении списка объектами, со...


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

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