Возможный дубликат:
Почему C ++ не позволяет базовым классам реализовывать наследуемый интерфейс производного класса?
#include <iostream>
class Interface
{
public:
virtual void yell(void) = 0;
};
class Implementation
{
public:
void yell(void)
{
std::cout << "hello world!" << std::endl;
}
};
class Test: private Implementation, public Interface
{
public:
using Implementation::yell;
};
int main (void)
{
Test t;
t.yell();
}
Я хочу Test
класс должен быть реализован с точки зрения Implementation
и я хочу избежать необходимости писать
void Test::yell(void) { Implementation::yell(); }
метод. Почему это невозможно сделать таким образом? Есть ли другой способ в C ++ 03?
using
только приносит имя в область.
Это ничего не реализует.
Если вы хотите получить Java-подобие get-реализаций-наследованием, вам нужно явно добавить накладные расходы, связанные с этим, а именно virtual
наследование, вот так:
#include <iostream>
class Interface
{
public:
virtual void yell() = 0;
};
class Implementation
: public virtual Interface
{
public:
void yell()
{
std::cout << "hello world!" << std::endl;
}
};
class Test: private Implementation, public virtual Interface
{
public:
using Implementation::yell;
};
int main ()
{
Test t;
t.yell();
}
РЕДАКТИРОВАТЬ: немного подковать эту функцию, мне пришлось отредактировать, чтобы код компилировался с g ++. Который автоматически не признал, что реализация yell
и интерфейс yell
были одно и то же. Я не совсем уверен, что стандарт говорит об этом!
Других решений пока нет …