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



发布了一个关于继承和混合接口类的问题:
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_IntfBinary_Stream_Write_Read_Intf相同吗
  2. 在函数调用中,一个可以替代另一个吗
  3. 它们都可以用于需要Binary_Stream_Read_Intf

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

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

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

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

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

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

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

  1. 不,就像struct Foo {};struct Bar {};不一样。

  2. 否,请参阅上文。

  3. 是的。

最新更新