面试题答案
一键面试抽象类构造函数与单例设计模式的关联
- 关联方式:
- 在C++ 中,单例模式确保一个类只有一个实例,并提供一个全局访问点。当单例模式的实现类继承自抽象类时,抽象类的构造函数可以用于初始化一些基础资源或状态,这些资源或状态对于单例类的正确运行可能是必需的。
- 抽象类构造函数不能直接创建对象,但它会在派生的单例类构造时被调用,用于初始化从抽象类继承而来的成员变量等。
- 抽象类构造函数在单例模式实现类继承自抽象类时的作用:
- 初始化抽象类中的成员变量,这些变量可能被单例类使用。
- 执行一些单例类通用的初始化逻辑,比如设置一些默认配置等。
代码示例
#include <iostream>
#include <memory>
// 抽象类
class AbstractBase {
public:
AbstractBase() {
std::cout << "AbstractBase constructor called." << std::endl;
// 可在此处进行一些通用初始化
}
virtual ~AbstractBase() = default;
virtual void doSomething() = 0;
};
// 单例类继承自抽象类
class Singleton : public AbstractBase {
private:
static std::unique_ptr<Singleton> instance;
Singleton() {
std::cout << "Singleton constructor called." << std::endl;
}
~Singleton() = default;
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
public:
static Singleton& getInstance() {
if (!instance) {
instance.reset(new Singleton());
}
return *instance;
}
void doSomething() override {
std::cout << "Singleton is doing something." << std::endl;
}
};
std::unique_ptr<Singleton> Singleton::instance = nullptr;
int main() {
Singleton& s1 = Singleton::getInstance();
s1.doSomething();
Singleton& s2 = Singleton::getInstance();
std::cout << "s1 and s2 are the same instance: " << (&s1 == &s2) << std::endl;
return 0;
}
在上述代码中:
AbstractBase
是一个抽象类,其构造函数输出一条信息,模拟一些初始化操作。Singleton
类继承自AbstractBase
,实现了单例模式。当Singleton
的实例被创建时,会先调用AbstractBase
的构造函数,然后调用Singleton
的构造函数。- 在
main
函数中获取Singleton
的实例,调用其doSomething
方法,并验证两次获取的实例是否为同一个。