C ++如何避免从接口覆盖虚拟方法

Posted

技术标签:

【中文标题】C ++如何避免从接口覆盖虚拟方法【英文标题】:C++ how to avoid overriding virtual method from interface 【发布时间】:2019-04-09 16:56:17 【问题描述】:

我来自 JVM 世界,我尝试用 c++ 实现一些东西。

我有一个界面:

class MyInterface

    public:
        virtual void my_method(std::string i) = 0;
        virtual void my_method(int i) = 0;
;

我想要两个子类 A 和 B:

class AClass: public MyInterface

public:
    void my_method(std::string i); // And implement only that method in .c file

B 类:

public BClass: public MyInterface

public:
    void my_method(int i); // And implement only that method in .c file

但我得到了错误。 (我不能粘贴日志,因为我只有生产代码,上面的代码只是真正问题的脚手架)。 有什么模式可以避免覆盖一些虚方法吗?

【问题讨论】:

当有人myAInstance.my_method(1); 时你想发生什么?还是myBInstance.my_method("X");?那么myInterfaceObject.my_method(1)呢? @user 你宁愿想要一个抽象类实现(具有默认行为)而不是一个纯虚拟接口吗? 【参考方案1】:

有什么模式可以避免覆盖一些虚方法吗?

我认为这没有任何模式。您只需确保所有虚拟成员函数都在最派生类或其父类之一中实现。

对于你拥有的功能来说,一个简单的实现并不难。

class AClass: public MyInterface

  public:

    void my_method(std::string i); // And implement only that method in .c file
    void my_method(int i)        // That's all you need
;

【讨论】:

【参考方案2】:

您的子类选择性地覆盖父方法。 你需要这样的东西:

class MyInterface // Consider a different name

    public:
        virtual void my_method(std::string i) 
        // Business Logic  . Let child 1 override this
        
        virtual void my_method(int i) 
        // Business Logic . Let child 2 override this
        
;

简而言之,这里不能有抽象的基础。

【讨论】:

这个问题显然是要覆盖方法。 @MaxLanghof 嗯。改变了解决方案。

以上是关于C ++如何避免从接口覆盖虚拟方法的主要内容,如果未能解决你的问题,请参考以下文章

css如何避免绝对定位覆盖其他元素?

如何避免swagger codegen接口中的默认方法实现?

C++ 字符串 - 如何避免获取无效指针?

如何在目标 c 中模拟类方法以与 TDD 一起使用

从多个来源获取数据时如何避免重复的类和方法名?

如何避免贫乏的领域模型,或者何时将方法从实体转移到服务中