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

时间:2013-02-21 18:13:27

标签: c++ interface multiple-inheritance name-lookup

有关于继承和混合接口类的问题:
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 个答案:

答案 0 :(得分:2)

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

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

这两个是一样的吗?它们具有相同成员的事实不足以使编译器将它们视为相同。但是,在我的例子中,因为他们确实共享相同的成员,所以你可以通过明确地将一个地址转换为另一个地址来逃避:

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

n->volume仍然可以使用。这更多是由于指针的魔力和危险而不是其他任何东西,并且依赖于编译器的行为方式,因此在技术上是未定义的行为。如果它完全有效,它只适用于所有成员都是相同的并且顺序相同的。我不确定在你的例子中,函数的顺序是一样的,所以我不能保证你能做那个糟糕的魔法。由于函数是虚函数,您可能会通过虚函数指针表,并且没问题。

2如果该函数正在调用Binary_Stream_Read_Write_Intf或Binary_Stream_Write_Read_Intf,则为no。编译器只接受该类或从它继承的任何类,并且这两个类都不是另一个类的后代。 (你可以说他们是兄弟姐妹。)但是,如果该函数正在调用Binary_Stream_Write_Intf或Binary_Stream_Read_Intf,那么你可以,因为那个调用父母他们都有共同点。像往常一样,如果没有共同的继承,那么你就无法替代。如果函数需要一个公共超类,是的,任何一个都可以工作。

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

答案 1 :(得分:0)

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

  2. 不,见上文。