c++ - 通过覆盖加入多个重叠的类?

标签 c++ inheritance virtual

我想知道以下案例,但我显然缺少足够的术语来在任何地方找到任何答案。

让我们从一个常见的案例开始:我总共有 3 个类。其中 2 个继承自第三个,应视为特化。

现在这 3 个类仍然是部分抽象的,并且每个都引入了新的纯虚函数,因为这种“类结构”可以针对不同的目的以不同的方式实现。并且这 3 个类中的每一个都从内部访问纯虚函数,因此它们不能在以后实现。

然后是第 4 类,它继承自第 2 类,以专门用于第 2 类的纯虚函数的用途。还有一个第 5 类,它对第 3 类做同样的事情。

现在还有1级的纯虚函数,需要根据4级和5级专门化。这是我遇到一些问题的地方,我可以想出 2 种方法来解决这个问题,但我并不真正满意。

  • 让第 6 类继承自第 1 类,并根据第 4 类和第 5 类的需要专门化其目的,并让这些类继承自第 6 类。这将导致“可怕的钻石”。

enter image description here

  • 有一个第 6 类不继承第 1 类,但它实现了适合第 4 类和第 5 类的专门目的。然后让第 4 类和第 5 类继承第 6 类,并添加第 1 类的纯虚函数的实现。这些实现除了调用 6th 的类似函数外什么都不做,同时传递相同的参数等。

enter image description here

我目前倾向于第二种解决方案,因为我想避免“钻石恐惧症”。但我不喜欢它附带的额外实现代码。有没有更简单的方法来组合不同的(接口(interface)/)类?

例如,使用第二种解决方案,我想的是在第 6 类中使用与第 1 类中声明的相同的函数原型(prototype),而不是告诉编译器第 1 类的函数应该被第 1 类的函数覆盖6年级。遗憾的是,using myfunction; 在第 4 类和第 5 类的类声明中不起作用。

或者一般性地问:有没有办法加入“接口(interface)”——这意味着一个类的纯虚函数可以由一个完全不同的类定义,只要原型(prototype)相同并且只要他们都是从 child 那里继承来的。我想尽可能避免重复代码,因为我不想要“繁重”的类。

如果这个照明太抽象,我会想出一个例子。

€dit:征求您的意见:在这种情况下最好的解决方案是什么?

最佳答案

我会选择与第一个非常相似的解决方案:

  1. 完全按照您的描述创建第 6 类。
  2. 现在使用桥接设计模式 - 在类型 1 的 2 和 3 中都有一个内部成员。将类 6 的实例注入(inject)该内部成员。
  3. 为第 4 类和第 5 类中缺少的虚拟方法创建一个隧道实现。该实现应该是一个单行代码,它只调用第 6 类中的具体实现。

希望这对您有所帮助。如果您需要更多帮助,我会尝试详细说明。

==============

根据您的评论,希望对您有所帮助:

嗯,不完全是。采用第一个解决方案并从 4 和 5 中删除 6 的继承(4 继承 2,5 继承 3,仅此而已)。

类 6 继承了 1。让我们调用类 1 - Base。向类 4 和类 5 添加一个 Base 类型的成员(我们称之为 impl)。

假设第 4 类是 foo,第 2 类是 Base2。它看起来像(对于糟糕的 C++ 语法感到抱歉,自从我编写实际的 C++ 代码以来已经有一段时间了):

class foo: Base2
{ 
     private Base* impl; 

     public foo(Base* impl) { this.impl = impl; } 

     void virtualMethod() { 
            this.impl->virtualMethod() 
     } 
}

关于c++ - 通过覆盖加入多个重叠的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15799220/

相关文章:

php - 如何访问特征中的类成员(或获得类似的行为)?

c# - 为什么 Rhino.Mocks 和 Moq 说 Bar 是不可覆盖的成员?

C# Indexer 属性 - 有什么方法可以虚拟化 get 而不是 set 方法?

c++ - 迭代器的模板参数 : function infers type when called?

c++ - 父类(super class)的指针如何访问子类的变量?

c++ - 折叠表达式 () 在哪里?

C++ 在 if-else 内部声明派生类对象并在外部使用它

c++ - 如何将已实现的虚拟成员函数作为参数传递

将类作为函数参数传递时出现 C++ 不完整类型错误

c++ - 如何使用冯·诺依曼邻域在 3D 空间中设置索引?