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

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

11.08.2019, 20:03. Показов 2373. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru