📜  C++程序的输出|套装18

📅  最后修改于: 2021-05-30 14:51:11             🧑  作者: Mango

预测以下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等的更多准备工作,请参阅“完整面试准备课程”