#include <iostream>
using namespace std;
class Base1 {
public:
virtual void f(int n) = 0;
};
class Base2 {
public:
virtual void f(char *s) = 0;
};
class Derive1 : public Base1, public Base2 {
public:
void f(int n) { cout << "d1 fn" << endl; }
void f(char *s) { cout << "d1 fs" << endl; }
};
class Derive2 : public Derive1 {
public:
void f(int n) { cout << "d2 fn" << endl; }
void f(char *s) { cout << "d2 fs" << endl; }
};
int main() {
Derive1 *d1 = new Derive2();
int n = 0;
char *s = "";
d1->f(n);
d1->f(s);
return 0;
}
Приведенный выше код работает, как и ожидалось, но если я закомментирую один из методов Derive1, я получу ошибку преобразования; если я закомментирую оба метода Derive1, я получу ошибку неоднозначности методов.
Что меня смутило, так это то, почему Derive1 должен определять эти два метода, почему определение их только в Derive2 не работает. Мне нужна помощь, чтобы понять это.
Некоторые уточнения:
Предположим, я никогда не хочу создавать экземпляры Derive1. Итак, совершенно нормально, если Derive1 является абстрактным классом.
«Все чистые виртуальные функции должны иметь определение в производном классе». Это неверно, если я не хочу создавать экземпляры этого производного класса.
Если я изменю f в Base1 на f1, а f в Base2 на f2 (просто изменю имена), то Derive1 не нужно определять ни один из них, достаточно определить f1 и f2 в Derive2.
Итак, с поддержкой перегрузки методов, как мне показалось, в приведенном выше коде я объявил функцию с именем вроде f_int в Base1; в Base2 я объявил функцию с именем вроде f_str. Именно так компилятор реализует перегрузку методов, верно? Но похоже, что это не так.