1

有一个关于继承和混合接口类的问题:
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. 它们都可以用于需要 a 的功能 Binary_Stream_Read_Intf吗?
4

2 回答 2

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,则否。编译器只接受该类或从它继承的任何东西,并且两个类都不是另一个类的后代。(不过,您可以说它们是兄弟姐妹。)但是,如果该函数调用 Binary_Stream_Write_Intf 或 Binary_Stream_Read_Intf,那么您可以,因为这是调用它们共同的父级。像往常一样,如果没有共同继承,那么你不能替代。如果该函数需要一个公共超类,是的,任何一个都可以。

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

于 2013-02-21T18:44:43.007 回答
0
  1. 不,就像struct Foo {};struct Bar {};不一样。

  2. 不,见上文。

  3. 是的。

于 2013-02-21T18:25:07.447 回答