gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:28 26 4
gpt4 key购买 nike

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

让我们从一个常见的案例开始:我总共有 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com