Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
half-horse half-gateway
101 / 71 / 39
Регистрация: 10.05.2016
Сообщений: 466
1

Вызов невиртуального метода в классе-наследнике

11.08.2019, 20:03. Показов 1785. Ответов 11

Добрый день!

Имеется следующий код:

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
#include <iostream>
 
using namespace std;
 
namespace some
{
    class A
    {
        public:
 
            A()
            {
                this->methodA();
            }
 
            int getA()
            {
                return this->n;
            }
 
        protected:
 
            virtual void methodA() {}
 
            void methodA(int n)
            {
                this->n = n;
            }
 
        private:
 
            int n;
 
    };
 
    class B : public A
    {
        public:
 
            B(int n)
            {
                this->methodA(n);
            }
 
        protected:
 
            virtual void methodA() override
            {
                this->methodA(0);
            }
 
    };
}
 
int main()
{
    B b(3);
    cout << b.getA() << endl;
 
    return 0;
}
Code::Blocks любезно выводит следующую ошибку: error: no matching function for call to 'some::B::methodA(int&)'.

Конечно, можно написать следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class B : public A
{
    public:
 
        B(int n)
        {
            A::methodA(n);
        }
 
    protected:
 
        virtual void methodA() override
        {
            A::methodA(0);
        }
 
};
Но тогда возникает следующая ошибка: error: cannot call member function 'void some::A::methodA(int)' without object. Суть ошибки мне понятна в данном случае. Прошу же подсказать, что не так с первым вариантом.

Заранее спасибо за помощь!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.08.2019, 20:03
Ответы с готовыми решениями:

Вызов метода в классе из другого
Не получается выполнить следующую цепочку действий. Запускаю метод в классе B через main, он...

Вызов метода одного класса в другом классе
Привет всем Когда запускаю, то в методе GetOut() вместо имени человека выводится цифра 1...

В производном классе вызов приватного метода базового класса
Добрый вечер. Помогите понять одну вещь. Имеется такое наследование: class test1 { public: ...

Объявить в классе-наследнике указатель, указывающий туда же, куда указывает указатель в классе-родителе
Здравствуйте. Имеется базовый класс MainWindow: #ifndef MAINWINDOW_H #define MAINWINDOW_H...

11
221 / 148 / 79
Регистрация: 14.03.2016
Сообщений: 459
11.08.2019, 20:15 2
Лучший ответ Сообщение было отмечено BlackStoneBlack как решение

Решение

Попробуйте использовать такой вызов:
C++
1
this->A::methodA(n);
1
half-horse half-gateway
101 / 71 / 39
Регистрация: 10.05.2016
Сообщений: 466
11.08.2019, 20:36  [ТС] 3
Cortas, сработало. Но в чём причина?
0
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,211
11.08.2019, 20:38 4
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
error: no matching function for call to 'some::B::methodA(int&)'.

лекарство:

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
#include <iostream>
 
namespace some
{
    struct A
    {
        virtual ~A(){}
        
        A()
        {
            this->methodA();
        }
 
        int getA() const noexcept 
        { 
            return this->n;
        }
    protected:
        virtual void methodA() {}
 
        void methodA(const int n)
        { 
            this->n = n;
        }
    private:
        int n = 333;
    };
 
    struct B : A
    {
        B(int n)
        { 
            A::methodA(n);
        }
    protected:
        virtual void methodA() override 
        { 
            A::methodA(0);
        }
    };
    
} // namespace some
 
int main()
{
    some::B b(3);
    std::cout << b.getA() << '\n';
}
код немного странноват.
не проще ли использовать конструктор?

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
#include <iostream>
 
namespace some
{
    struct A
    {
        virtual ~A(){}
        
        A(const int v):n(v){}
 
        int getA() const noexcept { return this->n; }
        
    private:
        int n = 333;
    };
 
    struct B : A
    {
        B(const int n): A(n) {}
    };
    
} // namespace some
 
int main()
{
    some::B b(3);
    std::cout << b.getA() << '\n';
}
0
half-horse half-gateway
101 / 71 / 39
Регистрация: 10.05.2016
Сообщений: 466
11.08.2019, 21:17  [ТС] 5
Цитата Сообщение от hoggy Посмотреть сообщение
A::methodA(n);
Я написал, что так не работает. Перечитайте моё сообщение.

Помог следующий вариант:

Цитата Сообщение от Cortas Посмотреть сообщение
this->A::methodA(n);
Цитата Сообщение от hoggy Посмотреть сообщение
не проще ли использовать конструктор?
В этом случае - проще, безусловно. Но это лишь упрощённый пример.
0
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,211
11.08.2019, 21:26 6
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Я написал, что так не работает. Перечитайте моё сообщение.
не нужно мне перечитывать твоё сообщение.

это тебе нужно сравнить твой нерабочий вариант, с моим рабочим.
и найти 10ть отличий.

https://rextester.com/NVLZQ68231
0
half-horse half-gateway
101 / 71 / 39
Регистрация: 10.05.2016
Сообщений: 466
11.08.2019, 23:35  [ТС] 7
Цитата Сообщение от hoggy Посмотреть сообщение
найти 10ть отличий
Их там нет. Разве что class на struct заменён, не более. Тем более, ответ мне уже дали вразумительный и без лишних слов.
0
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,211
12.08.2019, 00:04 8
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Их там нет.
ты ошибаешься.

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

а вот твой вариант не работает.
значит отличия есть.
просто ты их не видишь.

Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Их там нет. Разве что class на struct заменён, не более. Тем более,
дело не в ответе.
ответ, который ты получил - это скучно.

ты не получил ответ на свой главный вопрос.
ты так и не понял, в чем заключается проблема,
с которой ты столкнулся.


Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
вразумительный и без лишних слов.
вразумел стало быть?
ну так и из-за чего ошибка то была?
сможешь ответить?
0
221 / 148 / 79
Регистрация: 14.03.2016
Сообщений: 459
12.08.2019, 00:20 9
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Но в чём причина?
Честно говоря, не могу дать точный ответ, т.к. второй пример кода абсолютно верен (A::methodA()). Вероятно это особенности того компилятора, который стоит у вас в CodeBlocks, например у меня в VS 2017 (Visual C++ 14.1) все скомпилировалось без проблем.
0
half-horse half-gateway
101 / 71 / 39
Регистрация: 10.05.2016
Сообщений: 466
13.08.2019, 08:36  [ТС] 10
Cortas, самый обычный MinGW.

Добавлено через 9 минут
Цитата Сообщение от hoggy Посмотреть сообщение
просто ты их не видишь.
Во-первых, не "тыкайте" мне. Я, в любом случае, пытаюсь вести диалог с уважением к собеседникам. Поэтому и Вы будьте добры.

Во-вторых, если я их не вижу, то прошу, пардон, буквально ткнуть меня мордой в то, что я не заметил. Тем более, Вы так сильно этим обеспокоены.
Цитата Сообщение от hoggy Посмотреть сообщение
ответ, который ты получил - это скучно.
Мне дали рабочий вариант. Я этим удовлетворен. Причина кроется в особенностях компилятора. Да, по-хорошему нужно в этом разобраться, но на данном этапе изучения ЯП мне пока что достаточно и этого ответа.
0
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,211
13.08.2019, 17:54 11
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Во-первых, не "тыкайте" мне. Я, в любом случае, пытаюсь вести диалог с уважением к собеседникам. Поэтому и Вы будьте добры.
хочу и тыкаю.
не путай уважение с очковтирательством.

Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
если я их не вижу, то прошу, пардон, буквально ткнуть меня мордой в то, что я не заметил.
сложно ткнуть тебя мордой в код, который ты не посчитал нужным предоставить.

тот фрагмент кода из твоего старт-топика:
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Конечно, можно написать следующим образом:
он корректен.

что именно не работает в твоем реальном коде - телепаты в отпуске.


Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Причина кроется в особенностях компилятора.
есть такая забавная новичковая особенность - налажали в коде.
а виноват компилятор.

Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
мне пока что достаточно и этого ответа.
я ещё с твоего #7 сообщения понял,
что ты из тех, кому не принципиально знать как работает их код.
работает - и ладно.
0
half-horse half-gateway
101 / 71 / 39
Регистрация: 10.05.2016
Сообщений: 466
15.08.2019, 14:24  [ТС] 12
hoggy, с Вами, сеньор/сеньорита, всё предельно ясно. Вы слишком токсичны. Вас хлебом не корми, дай только, пардон, обосрать кого-нибудь. Поэтому, вероятно, Вы и сидите в разделе для новичков. Я бы Вам посоветовал пересмотреть свою жизненную позицию, но я уверен, что Вы явно не станете слушать меня.

Тот, кто действительно может и хочет помочь, без лишних слов подсказывает решение, а на вопрос "почему" либо сам даёт ответ, либо даёт готовый материал по теме (например, ссылку на статью в сети Интернет).

Также Вам нужно уяснить, что во всём разобраться сходу не получится. Очевидно, что всё изучается постепенно. В любом случае, моя проблема решена на данном этапе. Так что не вижу смысла продолжать нашу с Вами дискуссию. Уж тем более такую непродуктивную.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2019, 14:24

Перегрузка метода в классе-наследнике
...доброго времени суток, уважаемые форумчане!... ...Возник вопрос: не могу сообразить как...

Вызов метода базового класса, если он был переопределён в наследнике
Здравствуйте! Подскажите, пожалуйста, как вызвать метод базового класса из объекта наследника,...

Вызов метода в другом классе
Это метод класса.Я пытаюсь реализовать взятие на проходе пешки.Вопрос почему после каждого хода...

Вызов метода в другом классе
У меня очень обширный вопрос.Если вкратце я пишу курсач шахматы.У меня есть 3 класса Moves.cs...

Вызов метода не определенного в классе
Доброго времени суток. Волей судьбы необходимо разобраться в одной программе написанной на perl....

Не работает вызов метода PDO в дочернем классе
Есть класс: class Device { public static $device = array('id', 'name', 'type', 'buyDate',...


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

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

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