#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, у меня возникла ошибка неоднозначности методов.Перегрузка метода множественного наследования C++
Что меня смущает, почему Derive1 должен определить эти два метода, почему их определение только в Derive2 не работает. Мне нужна помощь, чтобы понять это.
Некоторые пояснения:
Давайте предположим, что я никогда не хочу, чтобы создавать экземпляры Derive1. Таким образом, это вполне нормально, если Derive1 является абстрактным классом.
«Все чистые виртуальные функции должны иметь определение в производном классе». Это неверно, если я не хочу создавать экземпляры этого производного класса.
Если я изменю f в Base1 на f1 и f в Base2 на f2 (просто измените имена), то Derive1 не обязательно будет определять какие-либо из них, просто определите f1 и f2 в Derive2.
Так, при поддержке перегрузки методы, я думал, в приведенной выше коде, я объявил функцию с именем, как f_int в Base1; в Base2 я объявил функцию с именем, как f_str. Это способ, которым компилятор реализует перегрузку метода, не так ли? Но похоже, что это не так.
Производные классы должны реализовывать все ** чистые ** виртуальные функции. –
Спасибо, я добавил это разъяснение к своему сообщению. – CoryKramer
* Конкретные * классы должны реализовывать все чистые виртуальные методы из своего базового класса. Промежуточный абстрактный класс не нужен. Это не проблема в этом случае. –