MST

星途 面试题库

面试题:C++中同名变量作用域与模板、继承结合分析

请结合C++模板和继承的知识,分析以下代码编译是否会报错,如果不报错,输出结果是什么,并详细阐述整个作用域解析过程。假设所有必要的头文件都已包含。 ```cpp class Base { public: int var = 1; }; template <typename T> class Derived : public T { public: int var = 2; void printVar() { std::cout << var << std::endl; std::cout << T::var << std::endl; } }; int main() { Derived<Base> obj; obj.printVar(); return 0; } ```
49.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 编译及输出结果
    • 这段代码编译不会报错。输出结果为:
    2
    1
    
  2. 作用域解析过程
    • std::cout << var << std::endl;
      • Derived类的printVar成员函数中,当访问var时,首先在Derived类的作用域内查找。因为Derived类中定义了int var = 2;,所以这里输出的是2。这符合C++的作用域查找规则,即从最内层作用域(这里是printVar函数体)开始查找,然后向外层作用域(Derived类作用域)查找。
    • std::cout << T::var << std::endl;
      • 这里通过T::var访问的是模板参数T(即Base类)中的var成员变量。因为Derived类继承自TBase类),Base类中定义了int var = 1;,所以这里输出的是1。这种通过类名限定符::来访问基类成员的方式,明确指定了要访问的是基类作用域中的成员,避免了与派生类同名成员的冲突。