Мне нужно использовать классы интерфейса C++ для реализации неуправляемой библиотеки DLL на C++. Предположим, у меня есть эта структура классов:Дизайн интерфейса и наследование в C++
class IA
{
public:
virtual void Foo() = 0;
...
};
class A : public IA
{
public:
virtual void Foo() override { ... }
...
};
class IB
{
public:
virtual void Bar() = 0;
...
};
class B : public IB
, public A
{
public:
virtual void Bar() { ... }
...
};
Теперь, если у меня есть указатель на интерфейс IB
, это не будет составлять:
IB* b = ...;
b->Foo();
Чтобы заставить его работать, я должен был бы сделать IB
не наследуют от IA
, как таковой:
class IB : public IA
{
...
};
Но тогда это тоже не компилируется, потому что теперь B
уже не конкретный класс, и компилятор ожидает, что он реализует IA::Foo
, хотя он наследует от A
.
Вы можете исправить это с помощью виртуального наследования:
class A : public virtual IA { ... };
class IB : public virtual IA { ... };
class B : public virtual IB, public A { ... };
который генерирует новое предупреждение в VC++:
warning C4250: 'B' : inherits 'A::A::Foo' via dominance
Как я понимаю, это потому, что теперь есть больше чем одна декларация Foo
.
Как правильно наследовать интерфейсы и их конкретную реализацию без этих проблем?
@ DieterLücking Это было неправильно. Спасибо, что заметили это. Я починил это. :) – Zeenobit
[Вот ответ, который объясняет C4250] (http://stackoverflow.com/questions/2190416/what-does-c4250-vc-warning-mean). Если вы в порядке с этим осложнением, тогда он должен работать нормально. – Guvante
@Guvante Учитывая тот факт, что я использую виртуальное наследование для наследования интерфейсов, я не думаю, что столкнулся бы с таким осложнением. Значит, вы бы сказали, что можно просто отключить предупреждение? – Zeenobit