次のヘッダーファイルと実装ファイルには、すべての3つの概念を組み合わせたが、コンパイルされません。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-仮想継承が関与するとき –
@MMそれだけです。ありがとう。 –