Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
#1

Задачка с наследованием и виртуальными функциями - C++

22.12.2012, 15:25. Просмотров 243. Ответов 9
Метки нет (Все метки)

Диаграмма классов на приложенном рисунке.

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
#include <iostream>
 
class IData {
public:
    virtual ~IData() = 0 {}
    virtual void funk() = 0;
};
 
class IHuman: virtual public IData {
};
 
class IClient: virtual public IData, virtual public IHuman {
};
 
class Human: public IHuman {
public:
    void funk() { std::cout << "Human\n"; }
};
 
class Client: public IClient, public Human {
public:
    void funk() { std::cout << "Client\n"; }
};
 
void Funk(IClient* client) {
    client->funk(); // Тут надо вызвать funk класса Human
}
 
int main() {
    IClient* client = new Client;
    Funk(client);
    delete client;
    return 0;
}
Собственно задача состоит в том, чтобы вызвать метод funk класса Human в функции Funk. Код можно менять по своему усмотрению. Но в программе необходимо, чтобы был только 1 объект из этой иерархии, при этом должен быть доступен функционал из IClient.
Миниатюры
Задачка с наследованием и виртуальными функциями  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2012, 15:25     Задачка с наследованием и виртуальными функциями
Посмотрите здесь:

Проблема с виртуальными функциями - C++
Привет. Столкнулся с небольшой проблемой, касательно виртуальных функций. Стыдно спрашивать, ибо это нечто элементарное. Просто я уже...

РАБОТА С ВИРТУАЛЬНЫМИ ФУНКЦИЯМИ - C++
Доброго времени суток, форумчани! Помогите мне, пожалуйста, с задачей, у меня просто нет этой темы, а сдать нужно обязательно :( ...

Классы с виртуальными функциями. Class Student - C++
Создать класс Студент со свойствами: ФИО, Факультет, Курс, минималь- ная оценка по экзаменам за последнюю сессию (по 5-ти бальной...

Неправильный вывод при работе с виртуальными функциями - C++
В общем, учу плюсы по книге Праты. Там есть одно задание по виртуальным функциям. Но дело сейчас не в них. У меня есть базовый (Cd) и...

можно ли делать виртуальными перегружаемые операторы? - C++
например так: virtual a&amp; a::operator=(a&amp; b);

Какие функции не могут быть виртуальными? - C++
Подскажите пожалуйста какие функции не могут быть виртуальными...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 15:40     Задачка с наследованием и виртуальными функциями #2
Цитата Сообщение от Riderik Посмотреть сообщение
вызвать метод funk класса Human в функции Funk
а почему именно этот? объект-то на самом деле типа Client же.
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 15:46  [ТС]     Задачка с наследованием и виртуальными функциями #3
yekka, по логике функция Funk должна работать с объектом Human (да, можно передавать IHuman*, так нагляднее).

Добавлено через 1 минуту
А вообще, если по программе, то funk должен получать данные объекта. Так вот, в функции Funk нужны именно данные класса Human
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 15:46     Задачка с наследованием и виртуальными функциями #4
Цитата Сообщение от Riderik Посмотреть сообщение
функция Funk должна работать с объектом Human
почему же она тогда в качестве аргумента принимает указатель на IClient, который не является базовым для Human?
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 15:49  [ТС]     Задачка с наследованием и виртуальными функциями #5
yekka, это я уже эксперименты проводил, пытаясь вызвать эту функцию. Да, функция принимает не то, что надо. Поэтому я и спросил как сделать чтобы вызвался метод из Human без создания нового объекта или копирования
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 15:52     Задачка с наследованием и виртуальными функциями #6
тогда как-то так:
http://liveworkspace.org/code/4tU3kH$15

Добавлено через 1 минуту
сама функция:
C++
1
2
3
void Funk(Human* client) {
    client->Human::funk(); // Тут надо вызвать funk класса Human
}
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 15:55  [ТС]     Задачка с наследованием и виртуальными функциями #7
yekka, хорошая мысль. Можно даже оставить указатель на интерфейс, а при вызове функции в аргументе динамик кастом ее в производную перебивать
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
22.12.2012, 15:58     Задачка с наследованием и виртуальными функциями #8
C++
1
2
3
4
class Human: virtual public IHuman {
public:
    void funk() { std::cout << "Human\n"; }
};
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 15:58     Задачка с наследованием и виртуальными функциями #9
только учти, что dynamic_cast не спасет тебя от того, что в строке client->funk(); по умолчанию будет вызываться функция Client::funk(), пока явно не укажешь, что тебе необходима именно версия Human::funk().
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2012, 16:00     Задачка с наследованием и виртуальными функциями
Еще ссылки по теме:

Непонятки с наследованием - C++
Будьте добры, проясните пожалуйста такой момент: Есть код: #include &lt;iostream&gt; using namespace std; class Counter { ...

Проблемы с наследованием - C++
подскажите пожалуйста пишу код, возникла проблема, получается в данном моем коде есть трехмерный масив в базовом класе и есть одномерный...

Проблема с наследованием - C++
Здравствуйте, уважаемые Все! Столкнулся со следующей проблемой. Необходимо реализовать паттерн программирования &quot;Фабричный метод&quot;....

Проблемы с наследованием - C++
Выпадает такая ошибка Error 3 error C2259: 'Operator' : cannot instantiate abstract class d:\учёба\ооп\терминал...


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

Или воспользуйтесь поиском по форуму:
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 16:00  [ТС]     Задачка с наследованием и виртуальными функциями #10
yekka, знаю, спасибо
Yandex
Объявления
22.12.2012, 16:00     Задачка с наследованием и виртуальными функциями
Ответ Создать тему
Опции темы

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