C++ 动态强制转换在具有公共派生类的两个类之间的工作方式

C++ 动态强制转换在具有公共派生类的两个类之间的工作方式,c++,inheritance,polymorphism,dynamic-cast,C++,Inheritance,Polymorphism,Dynamic Cast,在下面的代码中,我有一个派生自两个类/结构(I1和Base)的Derived1类。使用这个关系,我能够将基类型指针动态转换为I1类型。在Vtable中我无法理解。有人可以解释一下,这是如何工作的(就Vtable而言) struct Base { 虚~Base(){}; }; 结构I1 { 虚空f1()=0; }; //--------------------------------------------- struct Derived1:公共基,公共I1 { void f1(){st

在下面的代码中,我有一个派生自两个类/结构(I1和Base)的Derived1类。使用这个关系,我能够将基类型指针动态转换为I1类型。在Vtable中我无法理解。有人可以解释一下,这是如何工作的(就Vtable而言)

struct Base
{    
虚~Base(){};
};
结构I1
{ 
虚空f1()=0;
};
//---------------------------------------------
struct Derived1:公共基,公共I1
{

void f1(){std::cout亚瑟·奥德怀尔(Arthur O'Dwyer)在CppCon2017的这篇演示文稿中对一种方法做了一个很好的概述:。关于动态强制转换的清晰示例:
getBase()有点不得体
实际返回
Derived1
的一个实例。虽然
Base
I1
无关,但返回的实例类型为
Derived1
。因此,
动态转换
是可能的,并导致非
nullptr
。(我必须承认,我在代码中没有依赖这个事实。多重继承对我来说仍然有点可怕。);-)胶囊摘要:作为“最派生类”的一部分,类的每个实例都有一个单独的vtable。编译器为
Base
创建多个vtable,为最终从中继承的每个最派生类创建一个vtable。所有中间类也是如此。每个类实例及其所有超类都链接到正确的vtable。每个vtable都包含指向最派生类的vtable的链接D
 struct Base
 {    
    virtual ~Base() {};
 };

 struct I1
 { 
     virtual void f1() = 0;
 };

//---------------------------------------------
struct Derived1 : public Base, public I1 
{
    void f1() { std::cout << __FUNCTION__ << std::endl; }
};

//---------------------
Base* getBase()
{
    return new Derived1;
}

int main()
{

    Base* base = getBase();
    I1* i1 = dynamic_cast<I1*>(base);    
    i1->f1();

    return 0;
}