почему невозможно реализовать унаследованный чисто виртуальный метод с помощью директивы using?

Возможный дубликат:
Почему 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?

2

Решение

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 были одно и то же. Я не совсем уверен, что стандарт говорит об этом!

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]