Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 563

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

11.08.2019, 20:03. Показов 2403. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.08.2019, 20:03
Ответы с готовыми решениями:

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

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

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

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

Решение

Попробуйте использовать такой вызов:
C++
1
this->A::methodA(n);
1
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 563
11.08.2019, 20:36  [ТС]
Cortas, сработало. Но в чём причина?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.08.2019, 20:38
Цитата Сообщение от 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
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 563
11.08.2019, 21:17  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
A::methodA(n);
Я написал, что так не работает. Перечитайте моё сообщение.

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

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

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

https://rextester.com/NVLZQ68231
0
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 563
11.08.2019, 23:35  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
найти 10ть отличий
Их там нет. Разве что class на struct заменён, не более. Тем более, ответ мне уже дали вразумительный и без лишних слов.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.08.2019, 00:04
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Их там нет.
ты ошибаешься.

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

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

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

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


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

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

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

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

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

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


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

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

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

Также Вам нужно уяснить, что во всём разобраться сходу не получится. Очевидно, что всё изучается постепенно. В любом случае, моя проблема решена на данном этапе. Так что не вижу смысла продолжать нашу с Вами дискуссию. Уж тем более такую непродуктивную.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.08.2019, 14:24
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru