面试题答案
一键面试设计思路
- 访问控制:将
calculate
函数声明为private
或protected
,然后在Base
类中提供一个public
接口来间接调用calculate
函数。这样,外部代码只能通过Base
类提供的接口来调用calculate
,确保始终执行Base
类中的版本。 - 避免函数重写:由于
calculate
是非虚函数,派生类无法重写它,这符合始终执行Base
类版本的要求。 - 可维护性和扩展性:通过将核心计算逻辑封装在
calculate
中,并且提供统一的接口,有利于代码的维护和扩展。如果需要修改计算逻辑,只需要在Base
类的calculate
函数中修改即可。
代码示例
#include <iostream>
class Base {
private:
// 核心计算逻辑
void calculate() {
std::cout << "Base::calculate()" << std::endl;
}
public:
// 提供给外部调用的接口
void executeCalculate() {
calculate();
}
};
class Derived1 : public Base {
public:
// 这里不能重写 calculate 函数,因为它是 private 的
void doSomething() {
executeCalculate();
}
};
class Derived2 : public Derived1 {
public:
// 同样不能重写 calculate 函数
void doAnotherThing() {
executeCalculate();
}
};
int main() {
Base* basePtr = new Base();
Derived1* derived1Ptr = new Derived1();
Derived2* derived2Ptr = new Derived2();
basePtr->executeCalculate();
derived1Ptr->executeCalculate();
derived2Ptr->executeCalculate();
delete basePtr;
delete derived1Ptr;
delete derived2Ptr;
return 0;
}
在上述代码中:
Base
类的calculate
函数是private
的,外部无法直接调用。executeCalculate
函数作为公共接口,调用calculate
函数。Derived1
和Derived2
类继承自Base
,但无法重写calculate
函数,它们通过调用executeCalculate
来执行Base
类中的calculate
逻辑。通过这种方式,无论使用Base*
、Derived1*
还是Derived2*
指针调用executeCalculate
,始终执行的是Base
类中的calculate
版本。