следующий заголовок и реализация файлов сочетает в себе все три понятия, но не компилируется:Идиома Pimpl, отдельные файлы интерфейса/реализации и несколько виртуальных наследований. Как?
$ cat a.h
#include <memory>
class Base {
protected:
class BaseImpl;
std::shared_ptr<BaseImpl> pImpl;
Base(BaseImpl* impl)
: pImpl{impl}
{}
public:
virtual ~Base()
{}
virtual void func() =0;
};
class Der : public virtual Base {
private:
class DerImpl;
DerImpl* getPimpl() const noexcept;
public:
Der();
virtual ~Der()
{}
void func();
};
$ cat a.cpp
#include "a.h"
class Base::BaseImpl {
};
class Der::DerImpl : public virtual Base::BaseImpl {
public:
void func() {}
};
Der::Der()
: Base{new DerImpl()}
{}
Der::DerImpl* Der::getPimpl() const noexcept {
return static_cast<DerImpl*>(pImpl.get());
}
void Der::func() {
getPimpl()->func();
}
$ g++ --std=c++11 -c a.cpp
a.cpp: In member function ‘Der::DerImpl* Der::getPimpl() const’:
a.cpp:16:45: error: cannot convert from base ‘Base::BaseImpl’ to derived type ‘Der::DerImpl’ via virtual base ‘Base::BaseImpl’
return static_cast<DerImpl*>(pImpl.get());
^
могли бы вы сказать мне, что случилось, почему и как я мог бы иметь отдельные декларации и определения файлов с идиомой Pimpl и несколько виртуальных наследований.
http://stackoverflow.com/questions/7484913/why-cant-static-cast-be-used-to-down-cast- когда-virtual-inheritance-участвует –
@MM Вот и все. Благодарю. –