面试题答案
一键面试设计思路
- 定义虚基类:首先定义一个虚基类,它包含需要被访问的成员。
- 构建模板类体系:通过不同继承方式(公有、私有、保护)从虚基类派生模板类。
- 模板特化:利用模板特化来实现对虚基类成员访问的灵活控制。根据不同的业务逻辑,在特化模板类中对虚基类成员的访问进行定制。
关键实现代码
// 定义虚基类
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
派生。针对 int
和 float
类型进行了模板特化,分别采用私有和保护继承方式从 VirtualBase
派生。在不同的模板类及特化类中,通过 accessData
和 callVirtualFunction
方法展示了对虚基类成员的访问控制,以满足不同业务逻辑需求。