【问题标题】:Defining multiple derived Interface Members定义多个派生接口成员
【发布时间】:2012-08-12 10:40:17
【问题描述】:

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

// 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,因为编译器声明它是抽象的。 怎么了?

【问题讨论】:

标签: c++ interface virtual-inheritance abstract-base-class


【解决方案1】:

这里需要使用虚拟继承:

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:此 here 有一个副本,您可以在其中找到关于为什么会发生这种情况的解释。

【讨论】:

  • 谢谢!我现在可以编译代码,但我收到警告 C4250: 警告 C4250: 'S_B' : inherits 'S_A::S_A::f_a' via dominance 这是什么意思,我该怎么办?
  • @BetaCarotin 我猜它告诉你有钻石继承,它告诉你从S_A 得到f_a。但是我没有用VS,gcc也没有给我任何警告。
  • 好吧,我想我会忽略它。感谢您的帮助!
猜你喜欢
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 2018-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
相关资源
最近更新 更多