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

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

Войти
Регистрация
Восстановить пароль
 
krazyd
16 / 0 / 0
Регистрация: 10.11.2012
Сообщений: 96
#1

Особенности передачи объекта в функцию - C++

12.01.2016, 04:06. Просмотров 218. Ответов 6
Метки нет (Все метки)

Вечер добрый, форум!

Вопрос такой. Предположим есть класс class1, и есть class2, который является наследником класса class1. Имеется также функция func, которая приниммает объект класса class1.

Собственно вопрос: можно ли как-то в списке принимаемых параметров функции указать не именно объект класса class1, а сказать что-то вроде: принимай любой объект класса class1 или унаследовавшийся от него?

Заранее спасибо за ответ!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2016, 04:06
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Особенности передачи объекта в функцию (C++):

способы передачи объекта в функцию в качестве параметра - C++
Подскажите способы передачи обьекта в функцию в качестве параметра, пожалуйста

Передача объектов в функцию: особенности - C++
Здравствуйте! Пишу программу с применением классов, и возник один вопрос, на который то ли гугл не имеет ответа, то ли я плохо искал, но, в...

Как правильно вызывать функцию объекта из другой функции того же объекта? - C++
Доброго дня и ночи, уважаемые программисты! Существует некоторая проблема, на которую я наткнулся, решая задачу по программированию из...

Функция вне класса для передачи функции объекта - C++
Добрый вечер, уважаемые форумчане. Столкнулся с таким пунктом в условии задания: Создать функцию вне класса для передачи функции...

Способы передачи параметров в функцию - C++
#include<iostream> using namespace std; void swap1(int x, int y) { int z; z=x; x=y; y=z; ...

Ошибка передачи параметра в функцию - C++
#include "stdafx.h" #include "War.h" int _tmain(int argc, _TCHAR* argv) { War warv("Battle"); ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gru74ik
Модератор
Эксперт CЭксперт С++
4160 / 1808 / 197
Регистрация: 20.02.2013
Сообщений: 4,944
Записей в блоге: 21
12.01.2016, 07:01 #2
krazyd, в прототипе функции в качестве аргумента прописать родителя, а в вызове функции можно подставлять как родителя, так и наследника. Либо шаблонную функцию делать.

Пример по первому варианту
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
 
class Mammal
{
public:
    explicit Mammal(int breasts = 2) : m_breasts(breasts)
    {}
 
    void breathe()
    {
        std::cout << "I can breathe.\n";
    }
 
private:
    int m_breasts;
};
 
class Person : public Mammal
{
public:
    Person(int breasts, int legs, int hands) : Mammal(breasts)
    {
        m_legs = legs;
        m_hands = hands;
    }
 
    void run()
    {
        std::cout << "I can run.\n";
    }
 
private:
    int m_legs;
    int m_hands;
};
 
class Dolphin : public Mammal
{
public:
    Dolphin(int breasts, int fins) : Mammal(breasts)
    {
        m_fins = fins;
    }
 
    void swim()
    {
        std::cout << "I can swim.\n";
    }
 
private:
    int m_fins;
};
 
void func(Mammal & m)
{
    m.breathe();
}
 
int main()
{
    Mammal some_mammal;
    Person Lada(2,2,2);
    Dolphin Vera(2,4);
 
    func(some_mammal);
    func(Lada);
    func(Vera);
 
    return 0;
}


Пример по второму варианту
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
 
class Mammal
{
public:
    explicit Mammal(int breasts = 2) : m_breasts(breasts)
    {}
    void breathe()
    {
        std::cout << "I can breathe.\n";
    }
 
private:
    int m_breasts;
};
 
class Person : public Mammal
{
public:
    Person(int breasts, int legs, int hands) : Mammal(breasts)
    {
        m_legs = legs;
        m_hands = hands;
    }
 
    void run()
    {
        std::cout << "I can run.\n";
    }
 
private:
    int m_legs;
    int m_hands;
};
 
class Dolphin : public Mammal
{
public:
    Dolphin(int breasts, int fins) : Mammal(breasts)
    {
        m_fins = fins;
    }
 
    void swim()
    {
        std::cout << "I can swim.\n";
    }
 
private:
    int m_fins;
};
 
template <typename T>
void func(T & m)
{
    m.breathe();
}
 
int main()
{
    Mammal some_mammal;
    Person Lada(2,2,2);
    Dolphin Vera(2,4);
 
    func(some_mammal);
    func(Lada);
    func(Vera);
 
    return 0;
}
1
krazyd
16 / 0 / 0
Регистрация: 10.11.2012
Сообщений: 96
12.01.2016, 14:51  [ТС] #3
gru74ik, благодарю за ответ!

Появился вопрос по первому варианту. Не будет ли происходить typecasting ? Не будет ли вызываться тогда копи-конструктор?
0
rikimaru2013
C++ Game Dev
2436 / 1130 / 240
Регистрация: 30.11.2013
Сообщений: 3,687
12.01.2016, 15:20 #4
Цитата Сообщение от gru74ik Посмотреть сообщение
в прототипе функции в качестве аргумента прописать родителя
а сами пишите в списке инициализации в реализации метода - обманщик!!!!
0
gru74ik
Модератор
Эксперт CЭксперт С++
4160 / 1808 / 197
Регистрация: 20.02.2013
Сообщений: 4,944
Записей в блоге: 21
12.01.2016, 16:12 #5
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а сами пишите в списке инициализации в реализации метода - обманщик!!!!
Я имел ввиду функцию void func() из 54 строки кода.
1
rikimaru2013
C++ Game Dev
2436 / 1130 / 240
Регистрация: 30.11.2013
Сообщений: 3,687
12.01.2016, 16:33 #6
Цитата Сообщение от gru74ik Посмотреть сообщение
Я имел ввиду функцию void func() из 54 строки кода.
Эх ( Никак не могу выучить, что такое прототип)
0
gru74ik
Модератор
Эксперт CЭксперт С++
4160 / 1808 / 197
Регистрация: 20.02.2013
Сообщений: 4,944
Записей в блоге: 21
12.01.2016, 16:54 #7
Цитата Сообщение от krazyd Посмотреть сообщение
Появился вопрос по первому варианту. Не будет ли происходить typecasting ? Не будет ли вызываться тогда копи-конструктор?
Проверьте это сами. Добавьте в классы копи-конструктор с сигнальной строкой типа
C++
1
std::cout << "The copy constructor has been invoked here.\n";
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2016, 16:54
Привет! Вот еще темы с ответами:

Передача объекта в функцию или функцию друга - C++
Здравствуйте, уважаемые программисты :) К примеру есть такой код. #include &lt;iostream&gt; using namespace std; class My_Class1 { ...

Размер массива при передачи в функцию - C++
День добрый, подскажите столкнулся с такой проблемой: void masssize (char mass) { int size = sizeof(mass)/sizeof(mass); cout...

Правильный способ передачи вектора в функцию - C++
Доброго времени суток, начав изучать язык столкнулся с данным вопросом (название темы), сделал это так: #include &quot;iostream&quot; #include...

Отличие способов передачи массива в функцию - C++
В чем отличие: double sum(double x) от double sum(double *x) ?


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

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

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