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

Наследование: почему вызывается метод базового класса, а не производного? - C++

20.06.2015, 16:05. Просмотров 1009. Ответов 3
Метки нет (Все метки)

Всем привет, такой вопрос, почему вызывается в данном коде метод базового класса, а не производного (без указания ключевого слова virtual для func)
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
class A
{
public:
    A() { cout << "create A" << endl; };
    ~A() { cout << "delete A" << endl; };
     void func(){ cout << "func A" << endl; };
 
private:
 
};
 
class B :public A
{
public:
    B() { cout << "create B" << endl; };
    ~B() { cout << "delete B" << endl; };
     void func(){ cout << "func B" << endl; };
 
private:
 
};
 
 
void main()
{
 
    A *a_ptr = new A;
    B b;
 
    a_ptr = &b;
 
    a_ptr->func();
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2015, 16:05
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Наследование: почему вызывается метод базового класса, а не производного? (C++):

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом...

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать...

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого...

Указатель на объект базового класса и адрес объекта производного класса
Пример кода: class Class1 { public: Class1(int x) { j = new int;...

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

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса...

3
hoggy
Заблокирован
20.06.2015, 16:14 #2
Лучший ответ Сообщение было отмечено Ilot как решение

Решение

Цитата Сообщение от ritmix10 Посмотреть сообщение
почему вызывается в данном коде метод базового класса, а не производного (без указания ключевого слова virtual для func)
потому что метод не виртуальной.
1
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
20.06.2015, 20:16 #3
Лучший ответ Сообщение было отмечено Ilot как решение

Решение

Цитата Сообщение от ritmix10 Посмотреть сообщение
без указания ключевого слова virtual для func
Неужели сам не смог догадаться, раз такие пояснения даешь?

virtual для функций указывается как раз для того, чтобы выбор функции осуществлялся в динамике (в процессе выполнения программы), иначе - функция выбирается на основании статического типа указателя/ссылки.
В твоем случае вызывается функция для указателя, который имеет тип A* (строка 27). Стало быть и функция будет вызвана для этого же класса, а не из производного, на который фактически указывает указатель (строка 30).

Не по теме:

P.S. А ещё у тебя в коде утечка памяти.

0
DrOffset
22.06.2015, 23:15     Наследование: почему вызывается метод базового класса, а не производного?
  #4
 Комментарий модератора 
В этой теме располагаются ответы, согласно заданному вопросу. Обсуждение утечек памяти здесь.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2015, 23:15
Привет! Вот еще темы с ответами:

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса
Класс В является производным от класса А. Определить обработчик исключительной...

Вызов объектом базового класса функцию из производного класса!
Как можно осуществить вызов или передачу значения в базовый класс для...

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток...

Конструкторы базового и производного класса
class first { public: first(int a):first(a){} void Setfirst(int...


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

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

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