定义多个派生接口成员

Defining multiple derived Interface Members

本文关键字:接口 成员 派生 定义      更新时间:2023-10-16

我希望你能帮助我解决以下问题。我正在尝试创建一个灵活的接口系统并遇到了问题。这是相关代码:

// Interface 1
//      this: virtual f_a
// -> abstract
struct I_A abstract
{
    virtual void f_a() = 0;
};
// Interface 2
//      I_A : virtual f_a
//      this: virtual f_b
// -> abstract
struct I_B abstract : public I_A
{
    virtual void f_b() = 0;
};
// Implementation 1
//      I_A : virtual f_a
//      zhis: defines f_a
// -> not abstract
struct S_A : public I_A
{
    virtual void f_a() {}
};
// Implementation 2
//      I_B : virtual f_a
//      I_B : virtual f_b
//      S_A : defines f_a
//      this: defines f_b
// -> not abstract
struct S_B : public I_B, public S_A
{
    virtual void f_b() {}
};

我无法实例化S_B因为编译器声明它是抽象的。怎么了?

您需要在此处使用虚拟继承:

struct I_A
{
    virtual void f_a() = 0;
};
struct I_B : virtual public I_A
{
    virtual void f_b() = 0;
};

struct S_A : virtual public I_A
{
    virtual void f_a() {}
};

注意1:我忽略了类声明中的abstract语句,因为它不是标准C++。

注2:这里有一个副本,您可以在其中找到有关为什么会发生这种情况的解释。