Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
handkock
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
#1

Вызов перегруженной функциии при наследовании - C++

04.04.2015, 16:10. Просмотров 338. Ответов 6
Метки нет (Все метки)

Немного запутался. Есть класс Peshka. Создаю производный от него класс King:
C++
1
class King : public Peshka
Перегружаю некоторые методы класса Peshka в новом классе. Когда вызываю методы, которые перегужал из объекта исходного класса, вызываются перегруженные из King. В чем может быть проблема ?
http://www.cyberforum.ru/cpp-beginners/thread1216198.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2015, 16:10
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Вызов перегруженной функциии при наследовании (C++):

Ошибка при преобразовании числа в строку: "неоднозначный вызов перегруженной функции"
вот сокращенный код #include <iostream> #include <string> #define N 5 ...

Неоднозначный вызов перегруженной функции
Ошибка 1 error C2668: hash_helper::hash: неоднозначный вызов перегруженной...

Неоднозначный вызов перегруженной функции
Ввести с клавиатуры число n. Динамически выделить память для массива целых...

Неоднозначый вызов перегруженной функции
#include "stdafx.h" #include <iostream> #include <cmath> using namespace...

Неоднозначный вызов перегруженной функции
#include "stdafx.h" #include <cstdlib> #include <iostream> #include <math.h>...

6
hoggy
Заблокирован
04.04.2015, 17:18 #2
Цитата Сообщение от handkock Посмотреть сообщение
В чем может быть проблема ?
наверное, что-то работает не правильно!

C++
1
class King : public Peshka
перевожу на русский: "король - это частный случай пешки".
или по другому: "все короли - пешки, но не все пешки - короли".

другими словами, публичное наследование реализует отношение "является".

"Король является пешкой".

Вы уверены, что это именно то, что вам нужно?

http://rextester.com/FGT89086

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
#include <iostream>
 
struct Figure
{
    virtual ~Figure(){}
    virtual void move()const = 0;
};
 
 
struct Peshka: Figure
{
    virtual void move()const { std::cout<<"пешка пошла...\n"; }
};
 
 
struct King : Figure
{
    virtual void move()const { std::cout<<"король пошел...\n"; }
};
 
 
void test(Figure& figure)
{
    // --- а вот здесь методы наследников вызываются посредством полиморфизма
    figure.move();
}
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    King   k;
    Peshka p;
    
    // --- вот здесь без всякого полиморфизма напрямую будут вызывны методы наследников
    k.move();
    p.move();
    
    test(k);
    test(p);
}
1
handkock
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
04.04.2015, 18:16  [ТС] #3
hoggy, Спасибо. Но мне хотелось именно в своём случае разобраться, то есть с использованием классов. Почему вызывается функция дочернего класса у объекта класса-родителя ?
0
hoggy
Заблокирован
04.04.2015, 18:18 #4
Цитата Сообщение от handkock Посмотреть сообщение
Почему вызывается функция дочернего класса у объекта класса-родителя ?
телепаты в отпуске.
1
handkock
4 / 2 / 1
Регистрация: 15.10.2013
Сообщений: 94
04.04.2015, 18:28  [ТС] #5
hoggy, Смотрите.
C++
1
2
3
4
5
6
7
class Peshka
{
public:    
    void ShowMove(QPainter &p, QRect rect, int i);
    ~Peshka();
    void move(QRect rect, int check);
};
есть
C++
1
2
3
4
5
6
7
8
9
class King : public Peshka
{
public:
    void set(short ch);
    QRect getrect();
    void ShowMove(QPainter &p, QRect rect);
    King();
    ~King();
};
В этой программе я вызываю ShowMove в объектах каждого из классов, но с разными параметрами. То есть, Класс Пешка не знает о перегруженной функции в классе Король. Но, почему-то даже когда я вызываю Шоумув у пешки:
C++
1
 blackpeshka[j].ShowMove(p,rects[i][j].rect,i);
- тут три аргумента, всё равно выполняется Шоумув короля, в котором требуются только 2 параметра. Вот это-то и не могу понять.
0
hoggy
Заблокирован
04.04.2015, 18:50 #6
Цитата Сообщение от handkock Посмотреть сообщение
В этой программе я вызываю ShowMove в объектах каждого из классов, но с разными параметрами. То есть, Класс Пешка не знает о перегруженной функции в классе Король. Но, почему-то даже *blackpeshka[j].ShowMove(p,rects[i][j].rect,i);
- тут три аргумента, всё равно выполняется Шоумув короля, в котором требуются только 2 параметра. Вот это-то и не могу понять.
я вижу две невиртуальные функции-члены,
с разным количеством параметров,
среди которых нет параметров по умолчанию.

это дает мне основания полагать, что ваша трактовка событий ошибочна:

вызов:
C++
1
blackpeshka[j].ShowMove(p,rects[i][j].rect,i);
запустит версию пешки.
запуск версии короля невозможен.

--------------------------------------------------------

причина поведения в чем то другом.
не достаточно данных, что бы утверждать что либо наверняка.

можно конечно насочинять несколько разных версий, но я не гадалка.
и как писал выше - телепаты в отпуске.

вы можете просто выложить минимально-компилирующийся кусок кода,
который иллюстрирует проблему.
а можете погадать на кофейной гуще.
0
Nimo
34 / 25 / 15
Регистрация: 06.12.2012
Сообщений: 144
05.04.2015, 02:23 #7
Цитата Сообщение от handkock Посмотреть сообщение
В этой программе я вызываю ShowMove в объектах каждого из классов, но с разными параметрами. То есть, Класс Пешка не знает о перегруженной функции в классе Король. Но, почему-то даже когда я вызываю Шоумув у пешки:
Код C++
1
*blackpeshka[j].ShowMove(p,rects[i][j].rect,i);
- тут три аргумента, всё равно выполняется Шоумув короля, в котором требуются только 2 параметра. Вот это-то и не могу понять.
Потому что это не джава, и все методы по умолчанию не виртуальны.
Вы не перегрузили метод.
0
05.04.2015, 02:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2015, 02:23
Привет! Вот еще темы с решениями:

Неоднозначный вызов перегруженной функции (sqrt)
Вот в программе написано: int n, b; n = sqrt(b); // &lt;-- Неоднозначный вызов...

Pow: неоднозначный вызов перегруженной функции
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt;...

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

неоднозначный вызов перегруженной функции pow
Ошибка 1 error C2668: pow: неоднозначный вызов перегруженной функции...


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

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

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