MST
星途 面试题库

面试题:C++类单继承中成员访问权限的变化

在C++的单继承体系下,假设基类有不同访问权限(public、protected、private)的成员变量和成员函数,当以public、protected、private三种不同方式继承时,派生类对基类各成员的访问权限会如何变化?请举例说明。
35.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. public继承
    • 基类public成员:在派生类中仍为public成员。
    • 基类protected成员:在派生类中仍为protected成员。
    • 基类private成员:在派生类中不可访问。
    • 示例代码
#include <iostream>

class Base {
public:
    int publicVar;
    void publicFunc() { std::cout << "Base public function" << std::endl; }
protected:
    int protectedVar;
    void protectedFunc() { std::cout << "Base protected function" << std::endl; }
private:
    int privateVar;
    void privateFunc() { std::cout << "Base private function" << std::endl; }
};

class PublicDerived : public Base {
public:
    void accessBaseMembers() {
        publicVar = 10;
        publicFunc();
        protectedVar = 20;
        protectedFunc();
        // privateVar = 30; // 编译错误,无法访问基类private成员
        // privateFunc(); // 编译错误,无法访问基类private成员
    }
};

int main() {
    PublicDerived pd;
    pd.publicVar = 100;
    pd.publicFunc();
    // pd.protectedVar = 200; // 编译错误,外部无法访问protected成员
    // pd.protectedFunc(); // 编译错误,外部无法访问protected成员
    return 0;
}
  1. protected继承
    • 基类public成员:在派生类中变为protected成员。
    • 基类protected成员:在派生类中仍为protected成员。
    • 基类private成员:在派生类中不可访问。
    • 示例代码
#include <iostream>

class Base {
public:
    int publicVar;
    void publicFunc() { std::cout << "Base public function" << std::endl; }
protected:
    int protectedVar;
    void protectedFunc() { std::cout << "Base protected function" << std::endl; }
private:
    int privateVar;
    void privateFunc() { std::cout << "Base private function" << std::endl; }
};

class ProtectedDerived : protected Base {
public:
    void accessBaseMembers() {
        publicVar = 10;
        publicFunc();
        protectedVar = 20;
        protectedFunc();
        // privateVar = 30; // 编译错误,无法访问基类private成员
        // privateFunc(); // 编译错误,无法访问基类private成员
    }
};

int main() {
    ProtectedDerived pd;
    // pd.publicVar = 100; // 编译错误,外部无法访问protected成员
    // pd.publicFunc(); // 编译错误,外部无法访问protected成员
    return 0;
}
  1. private继承
    • 基类public成员:在派生类中变为private成员。
    • 基类protected成员:在派生类中变为private成员。
    • 基类private成员:在派生类中不可访问。
    • 示例代码
#include <iostream>

class Base {
public:
    int publicVar;
    void publicFunc() { std::cout << "Base public function" << std::endl; }
protected:
    int protectedVar;
    void protectedFunc() { std::cout << "Base protected function" << std::endl; }
private:
    int privateVar;
    void privateFunc() { std::cout << "Base private function" << std::endl; }
};

class PrivateDerived : private Base {
public:
    void accessBaseMembers() {
        publicVar = 10;
        publicFunc();
        protectedVar = 20;
        protectedFunc();
        // privateVar = 30; // 编译错误,无法访问基类private成员
        // privateFunc(); // 编译错误,无法访问基类private成员
    }
};

int main() {
    PrivateDerived pd;
    // pd.publicVar = 100; // 编译错误,外部无法访问private成员
    // pd.publicFunc(); // 编译错误,外部无法访问private成员
    return 0;
}