MST

星途 面试题库

面试题:C++模板类派生的复杂继承体系设计

设计一个具有多重模板类派生关系的继承体系,要求包含至少三层模板类派生,每层派生类需要有独特的功能和数据成员。同时,在派生类中实现一个静态成员函数,用于获取整个继承体系中特定类型对象的数量。请详细说明设计思路,并给出完整的代码实现,包括模板类的定义、派生关系以及静态成员函数的实现。
35.8万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 模板类层次结构:设计至少三层的模板类派生体系。每层派生类增加独特的数据成员和功能,以体现继承和功能扩展。
  2. 静态成员变量:在基类中定义一个静态成员变量,用于统计特定类型对象的数量。在构造函数中递增该变量,在析构函数中递减该变量。
  3. 静态成员函数:在每个派生类中实现一个静态成员函数,用于获取这个统计数量。

代码实现

#include <iostream>

// 基类模板
template <typename T>
class Base {
public:
    Base() { ++count; }
    virtual ~Base() { --count; }

    static size_t getCount() { return count; }

protected:
    static size_t count;
};

template <typename T>
size_t Base<T>::count = 0;

// 第一层派生类模板
template <typename T>
class Derived1 : public Base<T> {
public:
    Derived1() : data1(0) {}

    void setData1(T value) { data1 = value; }
    T getData1() const { return data1; }

    static size_t getCount() { return Base<T>::getCount(); }

private:
    T data1;
};

// 第二层派生类模板
template <typename T>
class Derived2 : public Derived1<T> {
public:
    Derived2() : data2(0) {}

    void setData2(T value) { data2 = value; }
    T getData2() const { return data2; }

    static size_t getCount() { return Base<T>::getCount(); }

private:
    T data2;
};

// 第三层派生类模板
template <typename T>
class Derived3 : public Derived2<T> {
public:
    Derived3() : data3(0) {}

    void setData3(T value) { data3 = value; }
    T getData3() const { return data3; }

    static size_t getCount() { return Base<T>::getCount(); }

private:
    T data3;
};

你可以使用以下方式测试这个继承体系:

int main() {
    Derived3<int> obj1;
    Derived3<int> obj2;

    std::cout << "Number of Derived3<int> objects: " << Derived3<int>::getCount() << std::endl;

    return 0;
}

在上述代码中:

  1. Base 模板类是整个继承体系的基类,它包含一个静态成员变量 count 用于统计对象数量,并提供了静态成员函数 getCount 来获取这个数量。
  2. Derived1 模板类从 Base 派生,增加了数据成员 data1 和相关的访问函数。
  3. Derived2 模板类从 Derived1 派生,增加了数据成员 data2 和相关的访问函数。
  4. Derived3 模板类从 Derived2 派生,增加了数据成员 data3 和相关的访问函数。
  5. main 函数中,创建了两个 Derived3<int> 对象,并通过调用 getCount 函数输出对象的数量。