有关于继承和混合接口类的问题:
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
{ ; };
以下是我的问题:
Binary_Stream_Read_Write_Intf
和。{
Binary_Stream_Write_Read_Intf
一样吗?Binary_Stream_Read_Intf
?答案 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)
不,就像struct Foo {};
和struct Bar {};
不一样。
不,见上文。
是