C++编程:解析趋势科技笔试中关于继承与模板的题目

5星 · 超过95%的资源 需积分: 9 89 下载量 191 浏览量 更新于2024-12-04 1 收藏 11KB TXT 举报
"本文介绍了两道趋势科技笔试题,第一题涉及C++的继承与多态,第二题关于C++模板的特化与调用规则。" 在第一道笔试题中,我们看到一个C++的继承和多态的例子。类`A`有一个默认构造函数和三个重载的`func`函数,一个是接收`int`类型数据,一个是`const int`类型数据,还有一个接收`char*`字符串。类`B`继承自`A`,并覆盖了`func`方法。在`main`函数中,通过基类指针`pA`和`pcA`分别调用了这些函数,展示了C++的动态绑定特性。 1. 当基类指针`pA`指向派生类对象`b`时,调用的`func(int)`是派生类`B`中的实现(输出`B2 :1`),这是因为C++的虚函数机制使得多态调用可以调用到派生类的版本。而调用`func("test")`时,由于没有显式指定参数类型,C++选择了最匹配的函数,即基类`A`中的`func(char*)`(输出`A3 test)`)。 2. `const A *pcA`指向派生类`B`的对象,调用`func(2)`时,因为函数是`const`修饰的,所以调用了基类`A`中对应的`const`版本`func(int data) const`(输出`A2 :2`)。 第二道笔试题涉及到C++模板的优先级问题。首先,我们有模板函数`func(const T& t)`,以及非模板的`func(const int& t)`。当调用`func(10.3)`时,由于`double`不能直接转换为`int&`,编译器选择模板函数,输出`10.3`。当调用`func(1000)`时,`int`可以直接传递给`const int&`,所以先调用了非模板的`func(const int& t)`,输出`1000`。 如果将非模板的`func(const int& t)`放在模板函数之前,那么在调用`func(1000)`时,非模板版本会被优先选择,导致模板版本不被调用,因此输出结果为`1100`,这是因为在模板特化和模板实例化之间,非模板函数具有更高的优先级。 最后一部分代码展示了一个C++的私有析构函数的问题,类`klass`的析构函数被声明为私有的,这意味着外部不能直接删除`klass`的对象。在`main`函数中,尝试调用`k.test()`,这会触发`klass`的`func`成员函数,但由于`~klass()`是私有的,所以在`test`内部试图调用析构函数会报错。这强调了C++中访问控制的重要性,以及如何处理包含私有析构函数的对象。 总结来说,这些题目涵盖了C++中的多态性、模板特化和调用规则,以及访问控制和对象生命周期管理,这些都是C++程序员需要掌握的基本概念。