MST

星途 面试题库

面试题:C++ 抽象类构造函数在单例模式中的潜在应用

在 C++ 中,简述抽象类构造函数如何能与单例设计模式相关联?如果在单例模式的实现类继承自一个抽象类,抽象类构造函数会起到什么作用?请结合代码示例说明。
28.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

抽象类构造函数与单例设计模式的关联

  1. 关联方式
    • 在C++ 中,单例模式确保一个类只有一个实例,并提供一个全局访问点。当单例模式的实现类继承自抽象类时,抽象类的构造函数可以用于初始化一些基础资源或状态,这些资源或状态对于单例类的正确运行可能是必需的。
    • 抽象类构造函数不能直接创建对象,但它会在派生的单例类构造时被调用,用于初始化从抽象类继承而来的成员变量等。
  2. 抽象类构造函数在单例模式实现类继承自抽象类时的作用
    • 初始化抽象类中的成员变量,这些变量可能被单例类使用。
    • 执行一些单例类通用的初始化逻辑,比如设置一些默认配置等。

代码示例

#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 方法,并验证两次获取的实例是否为同一个。