Помогите исправить код, не понимаю, почему не работает. c++
#include<iostream>
#include<cstdlib>
using namespace std;
class A {
public:
void f(int i){
cout<<"A::"<<i<<endl;
}
void f(double i){
cout<<"A::"<<i<<endl;
}
};
class B: public A{
void f(){
cout<<"B::"<<endl;
}
void f(int i){
cout<<"B::"<<i<<endl;
}
};
int main(){
A *p=new B;
p->f();
}
Сижу изучаю классы, но не понимаю, почему не работает.
Ответы (2 шт):
Код вполне рабочий, а ошибка достаточно банальна, и заключается в строке:
A *p=new B;
Вы привели объект класса B к A, в котором просто напросто не определен метод f() без параметров. Чтобы код заработал необходимо заменить строку вызова метода, передав значение int или double:
p->f(3);
Если же вы хотите обратиться к методам класса B то надо во-первых сделать их публичными как в классе A, во-вторых не приводить объект к классу A:
class B: public A{
public:
void f(){
cout<<"B::"<<endl;
}
void f(int i){
cout<<"B::"<<i<<endl;
}
};
int main(){
B *p=new B;
p->f();
}
Простой пример:
Допустим вы определили класс Ящик и его производный класс Компьютер, который может вычислять кроме того, что он ящик. Вы создали компьютер и обращаетесь к нему как ящик. И вы где то говорите "пусть ящик вычисляет". И на что это похоже?.. Для такого в С++ существуют виртуальные методы, и если вы хотите, чтобы при обращении к компьютеру как к ящику, можно было выполнить вычисление, то для ящика вы должны объявить соответствующий виртуальный метод, таким образом заранее устанавливая, что ящик может и вычислять:
struct Box {
virtual void compute() {}
};
struct Computer : Box{
void compute() { cout << 3 * 2; }
};
void foo(Box* pb)
{
pb->compute();
}
Какой Box вы передадите в функцию, еще не известно, главное, что он имеет этот метод и указатель на таблицу виртуальных функции, который укажет на метод Computer::compute, при вызове pb->compute() как только вы в функцию передадите Computer, таким образом присваивая pb = new Computer. Этот механизм не имеет отношение к вопросу, но зато дает понять, что разные намерения выполняются разными механизмами. Но, в любом случаи, обращение к В как А означает, что вам достаточно видеть его таким, и члены А(не важно виртуальные они или нет) достаточны для выполнения всех операций. Естественно, что через объект(указатель) производного класса можно обращаться к членам(не закрытым) базового, поскольку он унаследовал их, следовательно имеет эти члены.