在过去的5年里,我一直认为虚拟继承打破了静态组合。
但现在我发现,静态组合仍然保持不变,只有关于正确实例位置的附加信息。是这样的吗?
发布于 2010-12-02 21:14:06
使用虚拟继承的类的对象具有固定的内存布局,该布局在编译时确定。然而,访问虚拟库需要一定程度的间接性,因为您无法知道它相对于派生指针的位置。
请参阅Wikipedia
发布于 2010-12-02 21:33:49
也许我很傻,但我不明白你所说的“静态组合”是什么意思。你说pimpl破坏了它,所以让我们从它开始,去掉它的多态性和虚拟继承。
假设你有这样的代码:
#include <iostream>
using namespace std;
class Implementation
{
public:
bool do_foo() { return true; }
};
class Implementation2
{
public:
bool do_foo() { return false; }
private:
char buffer_[1024];
};
class Interface
{
public:
Interface(void* impl) : impl_(impl) {};
bool foo() { return reinterpret_cast<Implementation*>(impl_)->do_foo(); }
void change_impl(void* new_impl) { impl_ = new_impl; }
private:
void* impl_;
};
int main()
{
Implementation impl1;
Implementation2 impl2;
Interface ifc(&impl1);
cout << "sizeof(ifc+impl1) = " << sizeof(ifc) << "\n";
Interface ifc2(&impl2);
cout << "sizeof(ifc2+impl2) = " << sizeof(ifc2) << "\n";
ifc.change_impl(&impl2);
cout << "sizeof(ifc+impl2) = " << sizeof(ifc) << "\n";
cout << "sizeof(impl) = " << sizeof(impl1) << "\n";
cout << "sizeof(impl2) = " << sizeof(impl2) << "\n";
}
当你说“打破静态组合”时,你的意思是当你改变接口中的sizeof
时,pimpl的事情也改变了吗?
https://stackoverflow.com/questions/4335288
复制相似问题