0
class A {
 void methodToCall() {};
}

class B {
 B() {
   subscribeToEvent();
 }
 void eventHandler(Event* E) {
   call A::methodToCall()
 }
}

class C : public A, public B{
}  

这似乎是一种罕见的情况,所以让我解释一下我正在尝试做什么。

我有很多类似于 A 类的类。这些是由另一个框架生成的,所以我无法控制它们的生成方式。

对于每一个类 AI 都有一个或多个类C继承了像 A 这样的类。

我已经开发了在调用 eventHandler() 时调用 A::MethodToCall() 的需要。我的目标是不必在我的所有类(如 C 类)中订阅和提供 eventhadler 方法。

我宁愿创建一个 B 类,我的所有 C 类都可以简单地继承。

我的问题是我不知道如何从 B 类呼叫 A 类。

如果有更好的方法可以做到这一点,我愿意接受。

4

3 回答 3

1

您的代码与您的描述不匹配(在代码中 B 不从 A 继承,而在您的描述中它确实如此),但我认为您的意思是“我有大量像 A 这样的类,还有一个大从 A 类(在您的示例中为 C)继承的类的数量,并且在这些子类中有很多常见的东西我想排除(在您的示例中为 B),但它包括取决于特定的东西A(在你的例子中调用了一个 A 方法)并且它破坏了必须使许多 B (每个 A 一个)几乎都是一样的。”

您可以使用的一件事是“从参数继承的模板类”技巧将大量 B 变体定义为单个模板类:

template<class A> B : public A {
    void eventHandler(Event* E) {
       call methodToCall(); 
    }
}

class C1 : public B<A1> {
     ... whatever

class C2 : public B<A2> { ...

如果您有某些 A 类需要在 B 中稍有不同的东西,您也可以为这些类专门化 B 模板。

于 2012-12-18T21:03:34.507 回答
0

您可以编写一个包装类,它是 A 和 B 的子类。称为 D 的子类将知道 A 和 B,因此当事件发生时,D 负责处理它并调用 A。然后您可以让你的 C 类继承 D 类。

编辑:我想我在这里误解了你的问题。如果 B 继承了 A,那么 B 可以直接调用 A 中的函数(只要 A 的方法不是私有的。如果是,你无论如何都无法调用它)。

于 2012-12-18T20:48:59.693 回答
0

这段代码

class A {
 void methodToCall() {};
}

应该

class A {
 static void methodToCall() {};
}

为此:

 void eventHandler(Event* E) {
   A::methodToCall()
 }

因为您没有类型的对象A并且“B”一无所知A- 所以只有静态方法可用。

或者这样做

class B : public A ....
class C: public B

然后不需要静态,因为 B 继承了 A。

这是你的选择。

于 2012-12-18T20:56:00.937 回答