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

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

Восстановить пароль Регистрация
 
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 15:25     Задачка с наследованием и виртуальными функциями #1
Диаграмма классов на приложенном рисунке.

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

Добавлено через 1 минуту
А вообще, если по программе, то funk должен получать данные объекта. Так вот, в функции Funk нужны именно данные класса Human
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 15:46     Задачка с наследованием и виртуальными функциями #4
Цитата Сообщение от Riderik Посмотреть сообщение
функция Funk должна работать с объектом Human
почему же она тогда в качестве аргумента принимает указатель на IClient, который не является базовым для Human?
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 15:49  [ТС]     Задачка с наследованием и виртуальными функциями #5
yekka, это я уже эксперименты проводил, пытаясь вызвать эту функцию. Да, функция принимает не то, что надо. Поэтому я и спросил как сделать чтобы вызвался метод из Human без создания нового объекта или копирования
yekka
384 / 148 / 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
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 15:55  [ТС]     Задачка с наследованием и виртуальными функциями #7
yekka, хорошая мысль. Можно даже оставить указатель на интерфейс, а при вызове функции в аргументе динамик кастом ее в производную перебивать
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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
384 / 148 / 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++
C++ Создать абстрактный базовый класс с виртуальными функциями - площадь и периметр.
Создать базовый класс список. Реализовать на базе списка стек и очередь с виртуальными функциями вставки и вытаскивания C++

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

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

Текущее время: 09:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru