Помогите исправить код, не понимаю, почему не работает. 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 шт):

Автор решения: Tyzik

Код вполне рабочий, а ошибка достаточно банальна, и заключается в строке:

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();
}
→ Ссылка
Автор решения: AR Hovsepyan

Простой пример:

Допустим вы определили класс Ящик и его производный класс Компьютер, который может вычислять кроме того, что он ящик. Вы создали компьютер и обращаетесь к нему как ящик. И вы где то говорите "пусть ящик вычисляет". И на что это похоже?.. Для такого в С++ существуют виртуальные методы, и если вы хотите, чтобы при обращении к компьютеру как к ящику, можно было выполнить вычисление, то для ящика вы должны объявить соответствующий виртуальный метод, таким образом заранее устанавливая, что ящик может и вычислять:

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. Этот механизм не имеет отношение к вопросу, но зато дает понять, что разные намерения выполняются разными механизмами. Но, в любом случаи, обращение к В как А означает, что вам достаточно видеть его таким, и члены А(не важно виртуальные они или нет) достаточны для выполнения всех операций. Естественно, что через объект(указатель) производного класса можно обращаться к членам(не закрытым) базового, поскольку он унаследовал их, следовательно имеет эти члены.

→ Ссылка