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

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

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

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

22.12.2012, 15:25. Просмотров 246. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задачка с наследованием и виртуальными функциями (C++):

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

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

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

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

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

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

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

Добавлено через 1 минуту
А вообще, если по программе, то funk должен получать данные объекта. Так вот, в функции Funk нужны именно данные класса Human
0
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 15:46 #4
Цитата Сообщение от Riderik Посмотреть сообщение
функция Funk должна работать с объектом Human
почему же она тогда в качестве аргумента принимает указатель на IClient, который не является базовым для Human?
0
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 15:49  [ТС] #5
yekka, это я уже эксперименты проводил, пытаясь вызвать эту функцию. Да, функция принимает не то, что надо. Поэтому я и спросил как сделать чтобы вызвался метод из Human без создания нового объекта или копирования
0
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
}
1
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 15:55  [ТС] #7
yekka, хорошая мысль. Можно даже оставить указатель на интерфейс, а при вызове функции в аргументе динамик кастом ее в производную перебивать
0
Toshkarik
1141 / 858 / 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"; }
};
1
yekka
385 / 149 / 8
Регистрация: 12.05.2011
Сообщений: 450
22.12.2012, 15:58 #9
только учти, что dynamic_cast не спасет тебя от того, что в строке client->funk(); по умолчанию будет вызываться функция Client::funk(), пока явно не укажешь, что тебе необходима именно версия Human::funk().
0
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
22.12.2012, 16:00  [ТС] #10
yekka, знаю, спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2012, 16:00
Привет! Вот еще темы с ответами:

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

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

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

зачем может понадобиться делать операторы виртуальными? - C++
Дорогие программисты, во первых, хочу поздравить вас с Наступающим новым Годом! Я к вам обращаюсь с маленькой просьбой. Я никак не могу...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
22.12.2012, 16:00
Ответ Создать тему
Опции темы

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