面试题答案
一键面试设计思路
- 抽象类定义公共接口:定义一个抽象类,其中包含纯虚函数作为不同对象行为的接口。这样可以确保所有基于该抽象类派生的具体类都实现这些必要的行为。
- 模板元编程实现编译期选择:使用模板元编程在编译期根据不同的模板参数生成不同的代码。这使得我们可以在编译期就确定对象家族中不同对象的行为,从而实现编译期优化。
- 运行时多态性:通过继承抽象类和使用虚函数,在运行时根据对象的实际类型来调用相应的函数,保证运行时性能。
- 平衡编译期优化和运行时性能:编译期优化通过模板元编程来实现类型检查、代码生成等工作,减少运行时开销。运行时性能则通过合理使用虚函数表和动态绑定来保证,确保在需要多态行为时的效率。
关键代码示例
// 抽象类定义
class AbstractObject {
public:
virtual void doSomething() = 0;
virtual ~AbstractObject() = default;
};
// 模板元编程部分
template <typename T>
struct ObjectCreator {
static AbstractObject* create() {
return new T();
}
};
// 具体类示例1
class ConcreteObject1 : public AbstractObject {
public:
void doSomething() override {
std::cout << "ConcreteObject1 doing something" << std::endl;
}
};
// 具体类示例2
class ConcreteObject2 : public AbstractObject {
public:
void doSomething() override {
std::cout << "ConcreteObject2 doing something" << std::endl;
}
};
// 使用示例
int main() {
AbstractObject* obj1 = ObjectCreator<ConcreteObject1>::create();
AbstractObject* obj2 = ObjectCreator<ConcreteObject2>::create();
obj1->doSomething();
obj2->doSomething();
delete obj1;
delete obj2;
return 0;
}
在上述代码中:
AbstractObject
是抽象类,定义了doSomething
纯虚函数,为不同对象行为提供统一接口。ObjectCreator
模板类通过模板参数T
在编译期决定创建哪种具体类型的对象,实现编译期选择。ConcreteObject1
和ConcreteObject2
是继承自AbstractObject
的具体类,实现了doSomething
函数,展示不同行为。- 在
main
函数中,通过ObjectCreator
创建不同类型的对象,并调用它们的doSomething
函数,体现运行时多态性。同时,在编译期通过模板元编程确定创建对象的类型,优化编译期工作。