【问题标题】:C++ pure virtual functions implementation in derived class派生类中的 C++ 纯虚函数实现
【发布时间】:2018-10-14 20:23:10
【问题描述】:

我有一个 top API(基于抽象类),它由 base API 组成(将被不同的 top 重用API)。

class api_base {
public:
    virtual int foo() = 0;
};

class api_top : public api_base {
public:
    virtual int bar() = 0;
}

然后,我想为基础 API 提供一个基础实现:

class imp_base {
public:
    int foo() { return 1; }
}

最后使用基本 API 中定义的函数的基本实现实现 top API:

class imp_top : public api_top, public imp_base {
public:
    int bar() { return 1; }
}

当我实例化一个imp_top 类型的对象时,编译器说foo() 函数没有实现。但这不是真的,因为imp_top 派生自imp_base,它确实实现了foo() 函数。

对此有何建议?

提前谢谢你。

完整的测试代码:

    #include <stdio.h>

    class api_base { 
    public:
        virtual int foo() = 0;
    };

    class api_top : public api_base { 
    public:
        virtual int bar() = 0;
    };

    class imp_base { 
    public:
        int foo() { printf("foo from imp_base\n"); } 
    };

    class imp_top : public api_top, public imp_base { 
    public:
        int bar() { printf("bar from imp_top\n"); } 
    };

    int main()
    { 
       printf("Hello\n");                                                                                                                                                                                                                                                   
       imp_top a;

       a.bar();
       a.foo();

       return 1;
    }

编译结果:

    test.cpp:26:12: error: cannot declare variable ‘a’ to be of abstract type ‘imp_top’                                                                                                                                                                                     
        imp_top a;
                ^
    test.cpp:18:7: note:   because the following virtual functions are pure within ‘imp_top’:
     class imp_top : public api_top, public imp_base {
           ^
    test.cpp:5:17: note:  virtual int api_base::foo()
         virtual int foo() = 0;
                     ^
    test.cpp:29:6: error: request for member ‘foo’ is ambiguous
        a.foo();
          ^
    test.cpp:15:9: note: candidates are: int imp_base::foo()
         int foo() { printf("foo from imp_base\n"); }
             ^
    test.cpp:5:17: note:                 virtual int api_base::foo()
         virtual int foo() = 0;

【问题讨论】:

  • api_top 应该有一个 foo() 的实现
  • 您使用的是哪个版本的 C++ 标准?
  • @RX_DID_RX 任何非 Java 的 C++ 版本!

标签: c++ inheritance abstract-class multiple-inheritance


【解决方案1】:

首先在子类中重新定义函数时,始终使用override 关键字。

关于虚拟继承的第二篇阅读。

以下作品:

class api_base {
public:
    virtual int foo() = 0;
};

class api_top : public virtual api_base {
public:
    virtual int bar() = 0;
};

class imp_base : public virtual api_base {
public:
    int foo() override { printf("foo from imp_base\n"); return 0; }
};

class imp_top : public api_top, public imp_base {
public:
    int bar() override { printf("bar from imp_top\n"); return 0; }
};


int main(){
    imp_top a;

    a.bar();
    a.foo();
return 1;
}

【讨论】:

    【解决方案2】:

    变化:

    class api_top : public api_baseclass api_top : public virtual api_base

    和:

    class imp_baseclass imp_base : public virtual api_base

    然后就可以了。

    要了解这一点,请参阅:virtual inheritance。是的(刚刚看到 Ext3h 的帖子),使用 override 关键字。

    【讨论】:

      【解决方案3】:

      您应该使用了override 关键字,然后您会注意到您没有实现接口而是定义了一个全新的foo() 方法。

      您需要通过虚拟继承从api_base 派生imp_baseapi_top

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-02
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-18
        • 1970-01-01
        相关资源
        最近更新 更多