【问题标题】:Calling a base class method from a different base class that the child inherits从子继承的不同基类调用基类方法
【发布时间】:2012-12-18 20:44:27
【问题描述】:
class A {
 void methodToCall() {};
}

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

class C : public A, public B{
}  

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

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

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

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

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

我的问题是我不知道如何从 B 类调用 A 类。

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

【问题讨论】:

    标签: c++ inheritance base-class


    【解决方案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 模板。

    【讨论】:

    • 我认为这可行(假设底层代码是 C++ (即能够传递 A 的详细信息)
    • 我想这就是我所追求的。我编辑了我的原始帖子。当我有一次说 B 级时,我的意思是说 C 级,但你听懂了。谢谢!!!
    【解决方案2】:

    这段代码

    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。

    选择权在你。

    【讨论】:

    • 我想我需要澄清一下。我有 100 个类,比如 C 类。我还有另外 100 个类,比如 A 类。像 C 类这样的每个类都继承了一个对应的类,比如 A 类。我想要 1 个像 B 类这样的类,我可以让我的所有类都像类C 继承。第一个解决方案不起作用,因为我没有能力像 A 类那样编辑类。
    • 为什么有这么多类?我曾在非常大的系统上工作过,处理事件的类数量似乎过多。应该有一个更好的解决方案,更具可扩展性,更容易记录和调试。
    • 我试图保持项目不可知论.....但是类 As 是 QT 生成的 Ui_Files。 Cs 类是我们实现 gui 逻辑的包装器。当发生特定事件时,我需要在每个 A 类上调用 retranslateUi。我的目标是创建一个名为 Translatable(B 类)的类,我可以让所有需要翻译功能的 C 类继承。
    【解决方案3】:

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

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

    【讨论】:

    • 我想我需要澄清一下。我有 100 个类,如 C 类。我还有另外 100 个类,如 A 类。像 C 类这样的每个类都继承一个像 A 类的相应类。我想要 1 个像 B 类这样的类,我可以让我的所有类都像类C 继承。
    • 如此有效,您不想连接每个类 C 来继承类 A,而是让所有类 C 继承类 B,它足够聪明,可以将自己连接到基于你的 C 类的相应 A 类?
    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 2012-08-15
    • 2021-12-20
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    相关资源
    最近更新 更多