28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
1

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

22.12.2012, 15:25. Показов 513. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2012, 15:25
Ответы с готовыми решениями:

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

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

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

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

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

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

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

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

Создать абстрактный базовый класс Point с указанными виртуальными функциями
Доброго времени суток! Есть у меня задачка: Если с ф-цией draw и area мне все понятно, то как...

Создать абстрактный базовый класс Body (тело) с виртуальными функциями вычисления площади поверхности и объема
Напишите эту программу пожалуйста. Создать абстрактный базовый класс Body (тело) с виртуальными...

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

Создать базовый класс "список" с виртуальными функциями вставки и извлечения. Реализовать на базе списка произ
Создать базовый класс &quot;список&quot; с виртуальными функциями вставки и извлечения. Реализовать на базе...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru