【发布时间】:2017-06-30 20:48:25
【问题描述】:
以下头文件和实现文件结合了所有三个概念,但不会编译:
$ 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 习惯用法 和 多重虚拟继承拥有单独的声明和定义文件。
【问题讨论】:
-
@MM 就是这样。谢谢。
标签: c++ c++11 multiple-inheritance