首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >虚拟继承不会破坏静态组合吗?

虚拟继承不会破坏静态组合吗?
EN

Stack Overflow用户
提问于 2010-12-02 21:03:47
回答 2查看 990关注 0票数 5

在过去的5年里,我一直认为虚拟继承打破了静态组合。

但现在我发现,静态组合仍然保持不变,只有关于正确实例位置的附加信息。是这样的吗?

EN

回答 2

Stack Overflow用户

发布于 2010-12-02 21:14:06

使用虚拟继承的类的对象具有固定的内存布局,该布局在编译时确定。然而,访问虚拟库需要一定程度的间接性,因为您无法知道它相对于派生指针的位置。

请参阅Wikipedia

票数 3
EN

Stack Overflow用户

发布于 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的事情也改变了吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4335288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档