"华为笔试涉及到的C++编程与模板知识"
在华为的笔试中,经常会遇到C++相关的题目,特别是涉及类的继承、虚函数以及模板的使用。以下是对给定部分内容的详细解释:
1. **类继承与虚函数**:
- 在这段代码中,`class A` 定义了三个`func`函数,其中两个是虚函数。`class B` 是 `class A` 的派生类,并重写了其中的函数。
- 在 `main` 函数中,`A *pA` 指向一个 `B` 对象 `b`。当调用 `pA->func(1)` 时,由于 `func(int data)` 是虚函数,所以实际调用了 `B` 类的实现,输出 `B2:1`。而 `pA->func("test")` 调用的是非虚拟的 `func(char* str)`,因此调用 `A` 类的实现,输出 `A3:(test)`。
- 对于常量指针 `const A* pcA`,调用 `pcA->func(2)` 时,`func(int data)` 是 const 虚函数,所以依然调用了 `B` 类的实现,输出 `A1:1` 和 `A2:2`。这里展示了常量指针如何影响虚函数的调用。
2. **模板函数与类型推断**:
- 这部分代码展示了模板函数在处理不同类型时的行为。首先,有两组模板函数 `func`,一组接受 `const int &t`,另一组接受 `const T &t`。
- 当调用 `func(10.3)` 时,因为 `double` 类型不能直接转换为 `const int &`,所以选择了模板函数 `void func(const T &t)`,输出 `10.3`。
- 而 `func(1000)` 直接匹配到 `const int &` 的非模板函数,输出 `1000`。
- 如果将非模板函数删除,对于 `func(10.3)`,编译器会尝试找到一个模板函数来匹配,此时选择 `void func(const T &t)`,同样输出 `10.3`;而对于 `func(1000)`,因为没有非模板函数,模板函数 `void func(const T &t)` 被用于整型,输出 `1000`。
3. **错误修复**:
- 给定的代码片段最后有一个错误的类定义,`klass` 的析构函数定义在 `private` 部分。这将导致无法在类外部直接调用析构函数,通常析构函数应为 `public`。正确的做法应该是将析构函数声明为 `public`,以便在需要时可以正确地销毁对象。
总结,华为笔试题主要考察对C++语言基础的深入理解,包括类的继承、虚函数的多态性、模板的类型推断以及访问控制等核心概念。准备这样的笔试时,需要熟练掌握这些知识点,并能灵活应用到具体问题中。