【问题标题】:Calling function of one derived class in second derived class在第二个派生类中调用一个派生类的函数
【发布时间】:2018-03-10 04:09:03
【问题描述】:

多重继承有点问题。我有一个 C 类,它有两个基类 A 和 B。A 是主要基类,B 提供专业化。但是,B 需要能够调用属于 A 的方法。

我的问题是,如何将 A.foo() 暴露给 B 以便可以调用它?我一直在疯狂地搜索和阅读,但我找不到任何适合我的场景的东西。我尝试了模板类,但这又打开了一个蠕虫罐。我尝试了各种虚函数,但充其量都是导致链接器错误。

这基本上就是我想要做的……

    class A
    {
    public:
        void foo() { std::cout << "Hello there!"; }
    };

    class B
    {
    public:
        void bar() { foo(); }    // Call A::foo() here somehow
    };

    class C : public A, public B
    {
    };

    int main( void )
    {
        C _test;
        _test.bar();
    }

有没有人对我有什么建议?我还尝试使用另一个 A 和 B 都派生自的类,然后使用虚拟继承和姐妹类,但我也无法让它工作。

    class Z
    {
    public:
        virtual void foo()=0;
    };

    class A : public Z
    {
    public:
        void foo() { std::cout << "Hello there!"; }
    };

    class B : public Z
    {
    public:
        void bar() { foo(); }
    };

    class C : public A, public B
    {
    public:
    //  virtual void foo();
    };

    int main( void )
    {
        C _test;

        _test.bar();
    }

任何建议都将不胜感激,因为这是我需要实现的主要功能……不知何故。 :)

【问题讨论】:

  • 在B中定义一个虚方法,在C中实现后调用A中的方法。
  • 是的,这行得通。没有我希望的那么优雅,因为理想情况下,C 应该对 A 或 B 的实现一无所知,但至少它是一个可行的解决方案。非常感谢。

标签: c++ inheritance derived virtual-functions


【解决方案1】:

这是 Sam Varshavchik 建议的实现。它不需要额外的基类,所以它更精简一些并且工作得很好。

    class A
    {
    public:
        void foo() { std::cout << "Hello there!"; }
    };

    class B
    {
    public:
        virtual void foo() = 0;
        void bar() { foo(); }
    };

    class C : public A, public B
    {
    public:
        void foo() { A::foo(); }
    };

    int main(int argc, const char * argv[])
    {
        C _test;
        _test.bar();
    }

【讨论】:

    【解决方案2】:

    A::foo() 是类成员函数。要调用它,您要么必须有一个类实例指针,要么将其设为静态。如果B 必须调用A 方法,也许它应该从A 派生。其他解决方案是修改整个类层次结构,将函数调用移动到从AB 派生的类。您也可以将A 指针传递给B 构造函数以从那里调用它。

    【讨论】:

    • 指针传递对我来说太复杂了。从 A 派生 B 也不起作用,因为它们是完全独立的实体,不是彼此的类型,因此从另一个派生一个确实会破坏 OOP 公理。我已经发布了一个可行的解决方案,它几乎可以满足我的所有要求并且具有最小的编码开销,只需要在父类中转发受影响的函数。
    猜你喜欢
    • 2020-01-04
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    相关资源
    最近更新 更多