MST

星途 面试题库

面试题:C++类作用域下的名字隐藏问题

假设有一个基类A和派生类B,A中有一个成员函数func(),B中也定义了一个同名的func()。在派生类B的某个成员函数内,如果想要调用基类A的func(),应该怎么做?说明涉及到的C++类作用域规则,并给出代码示例。
28.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 调用方法:在派生类B的成员函数内,通过作用域解析运算符 :: 来调用基类A的 func() 函数。即使用 A::func(); 来调用。
  2. C++类作用域规则
    • 当在派生类中定义了与基类同名的成员函数时,派生类的成员函数会隐藏基类中的同名成员函数(这被称为函数隐藏规则)。这意味着在派生类的作用域内,直接调用该函数名会调用到派生类自己定义的函数。
    • 作用域解析运算符 :: 可以用来访问基类作用域中的成员,从而明确调用基类的同名函数。
  3. 代码示例
#include <iostream>

class A {
public:
    void func() {
        std::cout << "This is A's func()" << std::endl;
    }
};

class B : public A {
public:
    void func() {
        std::cout << "This is B's func()" << std::endl;
    }
    void callAFunc() {
        A::func();// 调用基类A的func()
    }
};

int main() {
    B b;
    b.func();// 调用B的func()
    b.callAFunc();// 调用A的func()
    return 0;
}

在上述代码中,B 类继承自 A 类,并且都有 func() 函数。在 B 类的 callAFunc() 成员函数中,使用 A::func(); 来调用基类 Afunc() 函数。在 main 函数中,先调用 b.func() 调用的是 B 类的 func(),再调用 b.callAFunc() 调用的是 A 类的 func()