Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
#1

Наследование классов, обратиться к замещающей функции

04.06.2014, 11:56. Просмотров 864. Ответов 6
Метки нет (Все метки)

заголовочный файл
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
#include <iostream>
using namespace std;
class X{
public:
    int x1,x2;
 
    X(int x_1, int x_2){
        x1 = x_1;
        x2 = x_2;
    };
    ~X(void){};
    
    virtual void set(int x_1,int x_2){
        x1 = x_1;
        x2 = x_2;
    };
    virtual void print(void){
        cout << "x1 = " << x1 << endl;
        cout << "x2 = " << x2 << endl;
    };
    
};
class Y: public X{
public:
    int y;
    Y(int x1, int x2,int y_1) : X(x1,x2){
        y = y_1;
     }
    ~Y(void){};
    void print(void){
        cout << "x1 = " << x1 << endl;
        cout << "x2 = " << x2 << endl;
        cout << "y = " << y << endl;
    };
    void set(int x_1,int x_2, int y_1){
        x1 = x_1;
        x2 = x_2;
        y = y_1; 
    };
    int run(void){
        return (x1 -x2)/y;
    };
};
*.cpp файл
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "stdafx.h"
#include "work_5.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
 
using namespace System;
 
int main()
{
   Y test_y(4,2,2);
   X *test_x;
   test_x = &test_y;
   test_x->print();
   test_x->set(6,0,2);
    _getch();
    return 0;
}
Компилятор говорит, что
1>work_5.cpp(16): error C2660: X::set: функция не принимает 3 аргументов
Весь инет вчера облазила не нашла, там надо как указать что мы работаем с Y а не X, не пойму механизм обращения с дочерними классами
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.06.2014, 11:56
Ответы с готовыми решениями:

Наследование классов, функции set и get
#include &lt;iostream&gt; using namespace std; class Pair { private: // &lt;--- int x; // &lt;--- ...

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

Реализовать иерархию классов (использовать наследование, полиморфизм, виртуальные функции)
Первый базовый класс – млекопитающие; поля – способ питания, вес, среда обитания. Во втором базовом...

Заменить наследование классов на наследование интерфейсов
#include &lt;iostream&gt; #include &lt;assert.h&gt; using namespace std; int people_on_base = 100; int...

Наследование классов. Копирование производных классов
Здравствуйте всем, у меня такой вопрос: написал код #include &quot;stdafx.h&quot; class A //Создаем...

6
castaway
Эксперт С++
4929 / 3036 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
04.06.2014, 11:58 #2
В 15-й строке убери ноль и одну запятую.
0
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
04.06.2014, 12:13  [ТС] #3
но мне нужно, что значения и x1 и x2 и y переприсвоились
0
castaway
Эксперт С++
4929 / 3036 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
04.06.2014, 13:02 #4
Тогда в 13-й строке заголовочного файла добавь запятую и int, чтобы метод set переопределялся.
0
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
04.06.2014, 13:06  [ТС] #5
а почему так разве он не должен что типа, вот раз три параметра, обращаться надо в Y:: print, почему он в Y идет через X какой смысл тогда в наследовании ? он что во все функции Y идет через X? почему на конструктор не жалуется?
0
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
04.06.2014, 15:18 #6
Лучший ответ Сообщение было отмечено Дъячелли как решение

Решение

Цитата Сообщение от Дъячелли Посмотреть сообщение
а почему так разве он не должен что типа, вот раз три параметра, обращаться надо в Y:: print, почему он в Y идет через X какой смысл тогда в наследовании ? он что во все функции Y идет через X? почему на конструктор не жалуется?
добавьте в базовый класс пустую функцию (для неё есть вроде отдельное название, но не помню...мб я путаю, дома посм)
virtual void set(int x_1,int x_2, int s){};
связано это (по идее, если не прав пусть ГУРУ поправят) с динамическим связыванием функции во время компиляции, то, что функция virtual означает, что содержатся ещё аналогичные функции (т.е. функции с(int ,int) , а не (int int int) - из-за возможности перегрузки функций в С++ их имена кодируются, и видимо в этом и трабл), соответственно компилятор ищет в Y функцию именно с 2мя аргументами

Добавлено через 11 минут
или можно создать чистую виртуальную функцию, тогда класс X будет абстрактным, тогда тоже всё работает
virtual void set(int x_1,int x_2, int s) = 0;//чистая виртуальная функция
1
Дъячелли
0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
04.06.2014, 15:20  [ТС] #7
да суть проблемы ясна, так работает все, получается что иначе никак и не сделаешь, из-за этой перегрузки
спасибо, за подсказку про виртуальную функцию, абстрактный класс как вариант
0
04.06.2014, 15:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.06.2014, 15:20

Наследование классов
к примеру , запись наследования класса class tria : public shape имеем доступ к public и...

Наследование классов
Здравствуйте, извините за глупый вопрос, но у меня проблема в следующем: Имеется базовый класс ...

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


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

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

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