预测以下C++程序的输出。
问题1
#include
using namespace std;
template
class A {
int arr[N];
public:
virtual void fun() { cout << "A::fun()"; }
};
class B : public A<2> {
public:
void fun() { cout << "B::fun()"; }
};
class C : public B { };
int main() {
A<2> *a = new C;
a->fun();
return 0;
}
输出:
B::fun()
通常,在C++中使用模板的目的是避免代码冗余。我们创建通用类(或函数),只要逻辑相同即可用于任何数据类型。数据类型成为参数,并且在传递数据类型时在编译时创建类/函数的实例。 C++模板还允许将非类型(表示值的参数,而不是数据类型)作为参数。
在上面的程序中,有一个通用类A,它带有一个非类型参数N。该类B继承自通用类A的实例。此实例A的N的值为2。 A <2>类。类C继承自B。在main()中,存在类型为A <2>的指针’a’,它指向C的实例。当调用’a-> fun()’时,类B的函数之所以执行此命令,是因为fun()是虚拟的,并且根据实际对象而不是根据指针调用了虚函数。在类C中,没有函数’fun()’,因此在层次结构中对其进行查找并在类B中找到它。
问题2
#include
using namespace std;
template
int fun()
{
i =20;
}
int main() {
fun<4>();
return 0;
}
输出:
Compiler Error
非类型参数的值必须恒定,因为它们在编译时用于创建类/函数的实例。在上面的程序中,模板化fun()接收一个非类型参数,并尝试对其进行修改,这是不可能的。因此,编译器错误。
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。