Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
294 / 200 / 6
Регистрация: 23.10.2010
Сообщений: 1,173
Записей в блоге: 1

Почему не вызывается метод setColor?

10.04.2014, 21:27. Показов 1733. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код использующий наследование, не могу вызвать метод setColor объект d[0];

Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <string>
 
using namespace std;
 
class myClass{
public:
    string name;
    int age;
    void setName(string a){
        name=a;
    }
    void setAge(int a){
        age=a;
    }
 
    virtual void getShow(){
        cout<<"Меня зовут "<<name<<" мне "<<age<<" лет";
    }
};
 
class Man:public myClass{
public:
    int color;
 
    void setColor(int a){
        color=a;
    }
 
    void getShow(){
        cout<<"Меня зовут "<<name<<" мне "<<age<<" лет "<<"Я Мужчина"<<color;
    }
};
 
class WoMan:public Man{
public:
    void getShow(){
        cout<<"Меня зовут "<<name<<" мне "<<age<<" лет "<<"Я Женщина"<<color<<endl;
    }
};
 
int main(){
    setlocale(0,"");
    myClass *d[2];
 
    d[0]=new Man;
    d[1]=new WoMan;
 
    d[0]->setName("Миша");
    d[0]->setAge(14);
 
 
    d[1]->setName("Катя");
    d[1]->setAge(10);
 
    for(int i=0; i<2; i++){
        d[i]->getShow();
    }
    system("pause");
}
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.04.2014, 21:27
Ответы с готовыми решениями:

Почему вызывается не тот метод?
При вызове метода Highlight() у экземпляра SomrClass вызывается базовая реализация class cBackLightListener { public: ...

Наследование: почему вызывается метод базового класса, а не производного?
Всем привет, такой вопрос, почему вызывается в данном коде метод базового класса, а не производного (без указания ключевого слова virtual...

Не вызывается метод
Здравствуйте! Изучаю язык C++, начал осваивать ООП. Для лучшего понимания решил написать программу, где массив задается через класс. Для...

9
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.04.2014, 21:53
Цитата Сообщение от xTIGRx Посмотреть сообщение
не могу вызвать метод setColor объект d[0];
Потому что наличие метода определяется на этапе компиляции, и в этот момент тип d[0] это myClass* (строка 44), у которого нет метода setColor. Тут надо либо добавить setColor в базовый класс, либо приводить d[0] к типу Man* (dynamic_cast).
0
294 / 200 / 6
Регистрация: 23.10.2010
Сообщений: 1,173
Записей в блоге: 1
10.04.2014, 22:08  [ТС]
А смысл тогда Наследования Если добавить в класс myClass. Я хотел взять все параметры от myClass, и хотел добавить новый метод setColor, а как правильно написать чтобы setColor было видно объекту d[0]?

да кстати я вот же привел к типу Man
d[0]=new Man; почему тогда не работает?

Добавлено через 8 минут
Tulosba, что скажите?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.04.2014, 22:09
Цитата Сообщение от xTIGRx Посмотреть сообщение
А смысл тогда Наследования Если добавить в класс myClass.
В базовый класс можно добавить "пустую" реализацию, или более того "чистую" (pure virtual).
Цитата Сообщение от xTIGRx Посмотреть сообщение
d[0]=new Man;
Тут стоит различать 2 типа: статический и динамический. Динамический тип объекта d[0] - Man, но он становится таковым только в процессе выполнения программы. Статический же тип задается во время компиляции, в объявлении переменной. И этот тип в данном случае myClass. Компилятор ищет функции на основании статического типа, поэтому и не находит там метода setColor.
0
Модератор
Эксперт С++
 Аватар для zss
13774 / 10967 / 6491
Регистрация: 18.12.2011
Сообщений: 29,247
10.04.2014, 22:14
Подтверждаю
C++
1
dynamic_cast<Man*>(d[0])->setColor(255);
компилируется.
1
294 / 200 / 6
Регистрация: 23.10.2010
Сообщений: 1,173
Записей в блоге: 1
10.04.2014, 22:23  [ТС]
Tulosba из вышего сказаного я мало что понял( можно пример какой нибудь или видеоурок

zss, я как понял оператор dynamic_cast создает динамический объект Man, так что получается что в памяти сейчас два объекта Man один статический другой динамический???
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.04.2014, 22:33
Добавление функции в базовый класс:
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
struct B
{
    virtual void f() {}; // пусто
    //virtual void f() = 0; // чистая виртуальная
    virtual ~B() {} // виртуальный деструктор нужен для правильного удаления
};
 
struct D : B
{
    virtual void f() { std::cout << "D::f()\n"; } 
};
 
 
int main() {
    
    B* b = new D;
    
    b->f(); // Вызовет D::f()
    
    delete b;
    
    return 0;
}

http://ideone.com/t1nxDI

Выяснение типа в ран-тайме:
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
struct B
{
    virtual ~B() {} // виртуальный деструктор нужен для правильного удаления
};
 
struct D : B
{
    void f() { std::cout << "D::f()\n"; } 
};
 
 
int main() {
    
    B* b = new D;
    
    // b->f(); // Ошибка компиляции
    D* d = dynamic_cast<D*>(b); // Выясняем является ли переменная b типом D
    if( d ) 
    {
        d->f(); // Вызываем только если действительно является
    }
    
    delete b;
    
    return 0;
}

http://ideone.com/u1dgIt
1
294 / 200 / 6
Регистрация: 23.10.2010
Сообщений: 1,173
Записей в блоге: 1
10.04.2014, 22:52  [ТС]
Вообще буду использовать dynamic_cast, только так и не объяснили влияет ли это на объем оперативной памяти или нет...
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
10.04.2014, 23:09
xTIGRx, объектов больше не становится. Преобразуются только типы. Это как если бы к Вам обращались просто как к человеку, а потом как к пользователю форума. Объект один, а типы разные.
0
294 / 200 / 6
Регистрация: 23.10.2010
Сообщений: 1,173
Записей в блоге: 1
10.04.2014, 23:14  [ТС]
Tulosba теперь понял смысл оператора dynamic_cast, спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2014, 23:14
Помогаю со студенческими работами здесь

Почему не вызывается деструктор?
Всем доброго времени суток! Подскажите пожалуйста - почему не вызывается деструктор при выполнении строки 48? ...

Почему вызывается деструктор?
Доброго времени суток. Написал такой код: struct O { virtual ~O() { cout &lt;&lt; &quot;hey&quot;; }...

Объясните почему вызывается деструктор
Вот код char* ConjunctionLots(ArrayLot firstLot, ArrayLot secondLot, ArrayLot thirdLot) { char *resultLot = new char; int...

Почему не вызывается конструктор перемещения?
#include &lt;iostream&gt; #include &lt;vector&gt; class Object { public: Object() { std::cout &lt;&lt; &quot;Object()&quot; &lt;&lt; std::endl; ...

Почему не вызывается конструктор копирования?
...У меня в книге описаны случаи при которых вызывается конструктор копирования. Один из этих случаев: : &quot;Когда аргумент имеет...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru