class Root
{
public:
    virtual void FooRoot()
    {
                std::cout << __FUNCTION__ << std::endl;
    }
    virtual void BarRoot()
    {
                std::cout << __FUNCTION__ << std::endl;
    }
};class Derived: virtual public Root
{
public:
    virtual void Foo1()
    {
        std::cout << __FUNCTION__ << std::endl;
    }    virtual void Bar1()
    {
        std::cout << __FUNCTION__ << std::endl;
    }
};sizeof(Derived) == 12, 其中经过调试,发现第一个4字节保存的是Derived的vptr,第三个4字节保存的是Root的vptr,第二个4个字节的内容是什么东西呢?我去访问它,结果violation access

解决方案 »

  1.   

    关注.但是vc6也是这个情况啊.
    我装了新的SDK.但也不应该啊.
      

  2.   

    与编译器有关
    与这句class Derived: virtual public Root中的virtual 关键字有关,即虚拟继承
      

  3.   

    #include <iostream>
    补充信息:class Root
    {
    public:
        virtual void FooRoot()
        {
                    std::cout << __FUNCTION__ << std::endl;
        }
        virtual void BarRoot()
        {
                    std::cout << __FUNCTION__ << std::endl;
        }
    };class Root2
    {
    public:
        virtual void FooRoot2()
        {
                    std::cout << __FUNCTION__ << std::endl;
        }
        virtual void BarRoot2()
        {
                    std::cout << __FUNCTION__ << std::endl;
        }
    };class Derived: virtual public Root, virtual public Root2
    {
    public:
        virtual void Foo1()
        {
            std::cout << __FUNCTION__ << std::endl;
        }    virtual void Bar1()
        {
            std::cout << __FUNCTION__ << std::endl;
        }
    };typedef void (*pFun)(void);
    int main()
    {
    Derived d;
    pFun fun = (pFun)*(int*)*(int*)&d;
    fun(); fun = (pFun)*((int*)*(int*)&d+1);
    fun(); fun = (pFun)*(int*)*((int*)&d+2);
    fun(); fun = (pFun)*((int*)*((int*)&d+2)+1);
    fun(); fun = (pFun)*(int*)*((int*)&d+3);
    fun(); fun = (pFun)*((int*)*((int*)&d+3)+1);
    fun(); getchar();
    return 0;
    }