Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Riderik
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
1

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

22.12.2012, 15:25. Просмотров 269. Ответов 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.
0
Миниатюры
Задачка с наследованием и виртуальными функциями  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2012, 15:25
Ответы с готовыми решениями:

Работа с виртуальными функциями
Доброго времени суток, форумчани! Помогите мне, пожалуйста, с задачей, у меня...

Проблема с виртуальными функциями
Привет. Столкнулся с небольшой проблемой, касательно виртуальных функций....

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

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

Реализовать абстрактный класс pair c виртуальными арифметическими функциями
Вот задание: Создать абстрактный базовый класс Pair с виртуальными...

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

Добавлено через 1 минуту
А вообще, если по программе, то funk должен получать данные объекта. Так вот, в функции Funk нужны именно данные класса Human
0
yekka
386 / 150 / 16
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 15:46 4
Цитата Сообщение от Riderik Посмотреть сообщение
функция Funk должна работать с объектом Human
почему же она тогда в качестве аргумента принимает указатель на IClient, который не является базовым для Human?
0
Riderik
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 15:49  [ТС] 5
yekka, это я уже эксперименты проводил, пытаясь вызвать эту функцию. Да, функция принимает не то, что надо. Поэтому я и спросил как сделать чтобы вызвался метод из Human без создания нового объекта или копирования
0
yekka
386 / 150 / 16
Регистрация: 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
}
1
Riderik
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 15:55  [ТС] 7
yekka, хорошая мысль. Можно даже оставить указатель на интерфейс, а при вызове функции в аргументе динамик кастом ее в производную перебивать
0
Toshkarik
1149 / 866 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
22.12.2012, 15:58 8
C++
1
2
3
4
class Human: virtual public IHuman {
public:
    void funk() { std::cout << "Human\n"; }
};
1
yekka
386 / 150 / 16
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 15:58 9
только учти, что dynamic_cast не спасет тебя от того, что в строке client->funk(); по умолчанию будет вызываться функция Client::funk(), пока явно не укажешь, что тебе необходима именно версия Human::funk().
0
Riderik
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 16:00  [ТС] 10
yekka, знаю, спасибо
0
22.12.2012, 16:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2012, 16:00

Создать абстрактный базовый класс с виртуальными функциями - площадь и периметр
Помогите написать,не врублюсь как писать много пропустил (( Задание:Создать...

Создать базовый класс список. Реализовать на базе списка стек и очередь с виртуальными функциями вставки и вытаскивания
Здравствуйте, помогите пожалуйста разобраться что как работает в программе...

Создать абстрактный базовый класс Тройка чисел с виртуальными методами увеличения на 1. Создать производный класс Время со своими функциями
Здравствуйте, пожалуйста помогите написать код к данной задаче, с таким...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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