在第二个派生类中调用一个派生类的函数

时间:2018-03-10 04:09:04

标签: c++ inheritance derived virtual-method

我有多个遗传问题。我有一个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();
    }

任何建议都会非常感激,因为这是我需要实现的一个主要功能......不知何故。 :)

2 个答案:

答案 0 :(得分: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();
    }

答案 1 :(得分:0)

A::foo()是一个类成员函数。要调用它,您必须具有类实例指针,或使其成为静态。如果B必须调用A方法,则可能应该从A派生。其他解决方案是重新处理整个类层次结构,以将函数调用移动到类,派生自AB。您也可以将A指针传递给B构造函数,以便从那里调用它。