从子级继承的其他基类调用基类方法

时间:2012-12-18 20:44:28

标签: c++ inheritance base-class

class A {
 void methodToCall() {};
}

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

class C : public A, public B{
}  

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

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

对于每个A类我都有一个或多个继承A类的 C 类。

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

我更愿意创建一个B类,我所有的C类都可以继承。

我的问题是我不知道如何从B级打电话给A班。

如果有更好的方法,我愿意接受它。

3 个答案:

答案 0 :(得分: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模板。

答案 1 :(得分:0)

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

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

答案 2 :(得分: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。

选择权在你手中。