У меня проблема с наследованием в C++. Приложенный код производит вывод «1,1», но я думал, что методы действий из классов b
и c
заменяют метод действия из класса a
. Поэтому я ожидал выход «2,3,». Что мне нужно изменить, чтобы получить результат «2,3,»?Наследование C++, функция не заменена в дочернем классе
#include <iostream>
//Class a
class a
{
public:
a();
int action();
};
a::a()
{
}
int a::action()
{
return 1;
}
//Class b
class b : public a
{
public:
b();
int action();
};
b::b()
{
}
int b::action()
{
return 2;
}
//Class c
class c : public a
{
public:
c();
int action();
};
c::c()
{
}
int c::action()
{
return 3;
}
//Main Programm
int main()
{
a arr[2];
arr[0] = b();
arr[1] = c();
for(int i = 0; i<2; i++)
{
std::cout << arr[0].action() << ",";
}
return 0;
}
Вы должны объявить метод как виртуальный, и он должен быть вызван с помощью указателя. – IronMensan
В частности, строка 'arr [0] = b();' приводит к тому, что объект типа 'b' создается по умолчанию, а затем набрасывается на тип' a', поэтому его можно сохранить в массиве. Приведение к 'a' означает, что результат больше не является' b', поэтому 'b :: action' не применяется. – Steve314
@ Steve314 - нет никакого кода в коде. Значение ** преобразуется ** в тип 'a'. –