如何使继承函数在没有虚函数的情况下调用派生类函数

时间:2017-08-23 17:03:03

标签: c++

我们假设我的课程AB如下:

class A
{
    public:
        void function_1(){ /*other codes*/; function_2();};
        void function_2();
 };

class B:public A
{
   public:
   void function_2(); // this function is reimplementation of A::function_2()
};

现在在主代码中假设我有

B objB;
objB.function_1();

根据我的测试,如果我保留上述代码,则在调用A::function_2()时,它仍会在内部调用objB.function_1()

我希望objB.function_1()在内部调用B::function_2(),而不是A::function_2()。是否可以这样做,前提是我无法更改A类的代码?

1 个答案:

答案 0 :(得分:0)

  

是否可以这样做,前提是我无法更改A类的代码?

正如其他人已经在评论中指出的那样,如果不将函数A::function_2()设为virtual函数,那是不可能的。

所以,如果你不能改变class A这是不可能的。

一种选择是在您的派生A::function_1()中重新实现class B

虽然您可以为A提供一个包装类,它提供可以在派生类中重写的虚函数,并使以后的继承者更容易:

class AWrap {
protected:
    A wrappedA;
public:
    virtual void function_1() {
        // Reimplement A::function_1() "other codes"
        function_2();
    }
    virtual void function_2() {
        wrappedA.function_2();
    }
};

class B : public AWrap {
public:
    void function_2() override {
         // Implement the B specific stuff
    }
};