MST

星途 面试题库

面试题:C++不同继承方式下虚基类访问在复杂模板元编程场景的应用

结合C++的模板元编程,设计一个模板类体系,其中涉及不同继承方式对虚基类的继承,要求在编译期通过模板特化等技术实现对虚基类成员访问的灵活控制,以满足不同的业务逻辑需求。请详细阐述设计思路及关键实现代码。
26.9万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 定义虚基类:首先定义一个虚基类,它包含需要被访问的成员。
  2. 构建模板类体系:通过不同继承方式(公有、私有、保护)从虚基类派生模板类。
  3. 模板特化:利用模板特化来实现对虚基类成员访问的灵活控制。根据不同的业务逻辑,在特化模板类中对虚基类成员的访问进行定制。

关键实现代码

// 定义虚基类
class VirtualBase {
public:
    int data;
    virtual void virtualFunction() {
        std::cout << "VirtualBase::virtualFunction" << std::endl;
    }
};

// 通用模板类,公有继承虚基类
template <typename T>
class CommonDerived : public VirtualBase {
public:
    void accessData() {
        std::cout << "CommonDerived access data: " << data << std::endl;
    }
    void callVirtualFunction() {
        virtualFunction();
    }
};

// 模板特化,私有继承虚基类
template <>
class CommonDerived<int> : private VirtualBase {
public:
    void accessData() {
        std::cout << "Specialized (private) access data: " << data << std::endl;
    }
    void callVirtualFunction() {
        VirtualBase::virtualFunction();
    }
};

// 模板特化,保护继承虚基类
template <>
class CommonDerived<float> : protected VirtualBase {
public:
    void accessData() {
        std::cout << "Specialized (protected) access data: " << data << std::endl;
    }
    void callVirtualFunction() {
        VirtualBase::virtualFunction();
    }
};

可以通过以下方式测试:

int main() {
    CommonDerived<double> d;
    d.data = 10;
    d.accessData();
    d.callVirtualFunction();

    CommonDerived<int> i;
    i.accessData();
    i.callVirtualFunction();

    CommonDerived<float> f;
    f.accessData();
    f.callVirtualFunction();

    return 0;
}

在上述代码中,VirtualBase 是虚基类。CommonDerived 模板类以公有继承方式从 VirtualBase 派生。针对 intfloat 类型进行了模板特化,分别采用私有和保护继承方式从 VirtualBase 派生。在不同的模板类及特化类中,通过 accessDatacallVirtualFunction 方法展示了对虚基类成员的访问控制,以满足不同业务逻辑需求。