Меня немного смущает "проблема множественного наследования". Рассмотрим следующий кусок кода:
#include <iostream>
struct iface
{
virtual void foo () = 0;
virtual ~iface () {}
};
struct wrapped
{
virtual void foo ()
{
std::cerr << "wrapped\n";
}
};
struct impl : public wrapped, public iface
{
};
iface* factory ()
{
return new impl;
}
int main ()
{
iface *object = factory ();
object->foo();
delete object;
return 0;
}
Это абстрагируется от некоторого кода, использующего идиому pimpl. Идея в том, что wrapped
— это какой-то сложный класс со всякими другими наворотами. iface
просто делает определенный аспект wrapped
видимым, а функция factory()
создает класс impl
, который реализует iface
, используя wrapped
. В моем реальном коде класс wrapped
происходит из библиотеки с огромным деревом заголовков, поэтому я определяю impl
в отдельной единице компиляции, чтобы остальная часть моего приложения не использовала их.
В любом случае, то, что я вставил, не компилируется и выдает следующую ошибку:
$ g++ -o test test.cc
test.cc: In function ‘iface* factory()’:
test.cc:23:16: error: cannot allocate an object of abstract type ‘impl’
return new impl;
^
test.cc:17:8: note: because the following virtual functions are pure within ‘impl’:
struct impl : public wrapped, public iface
^
test.cc:5:18: note: virtual void iface::foo()
virtual void foo () = 0;
^
Очевидно, что я могу избежать ошибки, написав конкретную реализацию foo
в impl
, которая пересылает в wrapped::foo()
, но я не понимаю, почему компилятор не подхватывает реализацию из класса wrapped
.
Я предполагаю, что каким-то образом "foo" из iface
и "foo" из wrapped
оказываются разными при разрешении имен (это правильное слово) для impl
, но я действительно не понимаю, почему.
Может кто-нибудь объяснить, что происходит?
impl
ниже по течению как отiface
, так и отwrapped
, поэтому нет способа убедить их двоих в том, что ихfoo
функции должны иметь одно и то же разрешенное имя (если это правильная терминология). Спасибо за помощь. - person Rupert Swarbrick   schedule 18.04.2014