代码之家  ›  专栏  ›  技术社区  ›  Thomas Matthews

函数解析中使用了多重继承顺序?

  •  1
  • Thomas Matthews  · 技术社区  · 11 年前

    发布了一个关于继承和混合接口类的问题:
    Multiple inheritance of interfaces in C++
    这让我想到了这个问题: 继承顺序是否会影响函数解析规则?

    鉴于:

    struct Binary_Stream_Read_Intf
    {
      virtual void load_from_buffer(uint8_t*& buffer_ptr) = 0;
    };
    
    struct Binary_Stream_Write_Intf
    {
      virtual void store_to_buffer(uint8_t*& buffer_ptr) const = 0;
    };
    
    struct Binary_Stream_Read_Write_Intf
    : public Binary_Stream_Read_Intf,
      public Binary_Stream_Write_Intf
    { ; };
    
    struct Binary_Stream_Write_Read_Intf
    : public Binary_Stream_Write_Intf,
      public Binary_Stream_Read_Intf
    { ; };
    

    以下是我的问题:

    1. Binary_Stream_Read_Write_Intf Binary_Stream_Write_Read_Intf 相同的?
    2. 在函数调用中,一个可以替代另一个吗?
    3. 它们都可以用于需要 Binary_Stream_Read_Intf ?
    2 回复  |  直到 7 年前
        1
  •  2
  •   Scott Mermelstein    11 年前

    1不,它们不一样。您用两个不同的名称声明了两个不同结构。编译器会将它们视为完全不同。这类似于说

    class Newspaper
    {
        int volume;
    };
    class TelevisionAudioControl
    {
        int volume;
    };
    

    这两个是一样的吗?它们有相同的成员这一事实不足以让编译器认为它们是相同的。但是,在我的例子中,由于他们确实共享相同的成员,您可以通过将一个成员的地址明确地转换为另一个成员来逃脱惩罚:

    TelevisionAudioControl tac;
    Newspaper * n = (Newspaper *)&tac;
    

    n->volume 仍然有效。不过,这更多地是由于指针的魔力和危险性,而不是其他任何东西,这取决于编译器的行为,技术上未定义的行为也是如此。如果它真的有效,那么只有当所有成员都相同时,它才有效 并且按照相同的顺序 。我不确定在你的例子中,函数的顺序是否相同,所以我不能保证你能做出糟糕的施法魔法。由于函数是虚拟的,您可能会浏览虚拟函数指针表,然后就可以了。

    2如果函数调用Binary_Stream_Read_Write_Intf或Binary_Sream_Read_Intf,则为否。编译器只接受该类或从中继承的任何类,并且两个类都不是另一个类的后代。(不过,你可以说他们是兄弟姐妹。)然而,如果函数调用的是Binary_Stream_Write_Intf或Binary_Sream_Read_Intf,那么你可以,因为这是对他们共同的父级的调用。和往常一样,如果没有共同的继承,那么你就无法替代。如果函数调用一个公共的超类,是的,那么任何一个都可以。

    3它们都继承自Binary_Stream_Read_Intf,所以是的。

        2
  •  0
  •   Kerrek SB    11 年前
    1. 不,就像 struct Foo {}; struct Bar {}; 不一样。

    2. 不,见上文。

    推荐文章