0 / 0 / 0
Регистрация: 03.02.2012
Сообщений: 58
1

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

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

Author24 — интернет-сервис помощи студентам
заголовочный файл
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.06.2014, 11:56
Ответы с готовыми решениями:

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

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

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

Автоматическая генерация классов С ++ с UML диаграмм классов. Наследование в с++. Абстрактные классы. WhiteStarUML
Создать классовую модель(желательно в WhiteStarUML), которая включает в себя абстрактный класс...

6
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2014, 15:20
Помогаю со студенческими работами здесь

Заменить наследование классов на наследование интерфейсов
#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 //Создаем...

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

Наследование классов
Дан базовый класс, показать как он будет наследоваться произвольным классом class planet { int...


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

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

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