我们假设我的课程A
和B
如下:
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
类的代码?
答案 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
}
};