面试题答案
一键面试1. 不同继承方式对基类成员访问属性的影响
- public继承:
- 基类的
public
成员在派生类中仍然是public
的,可以被派生类对象和其他外部代码访问。 - 基类的
protected
成员在派生类中仍然是protected
的,只能被派生类及其派生类的成员函数访问。 - 基类的
private
成员在派生类中不可访问,即使是派生类的成员函数也不能直接访问。
- 基类的
- private继承:
- 基类的
public
成员在派生类中变为private
的,只能被派生类的成员函数访问,外部代码无法通过派生类对象访问。 - 基类的
protected
成员在派生类中同样变为private
的,只能被派生类的成员函数访问。 - 基类的
private
成员在派生类中不可访问。
- 基类的
- protected继承:
- 基类的
public
成员在派生类中变为protected
的,只能被派生类及其派生类的成员函数访问,不能被外部代码通过派生类对象访问。 - 基类的
protected
成员在派生类中仍然是protected
的,访问权限不变。 - 基类的
private
成员在派生类中不可访问。
- 基类的
2. 代码示例
#include <iostream>
// 基类
class Base {
public:
int public_member;
protected:
int protected_member;
private:
int private_member;
public:
Base() : public_member(1), protected_member(2), private_member(3) {}
};
// public继承
class PublicDerived : public Base {
public:
void display() {
std::cout << "PublicDerived: public_member = " << public_member << std::endl;
std::cout << "PublicDerived: protected_member = " << protected_member << std::endl;
// 下面这行代码会报错,因为private_member在派生类中不可访问
// std::cout << "PublicDerived: private_member = " << private_member << std::endl;
}
};
// private继承
class PrivateDerived : private Base {
public:
void display() {
std::cout << "PrivateDerived: public_member = " << public_member << std::endl;
std::cout << "PrivateDerived: protected_member = " << protected_member << std::endl;
// 下面这行代码会报错,因为private_member在派生类中不可访问
// std::cout << "PrivateDerived: private_member = " << private_member << std::endl;
}
};
// protected继承
class ProtectedDerived : protected Base {
public:
void display() {
std::cout << "ProtectedDerived: public_member = " << public_member << std::endl;
std::cout << "ProtectedDerived: protected_member = " << protected_member << std::endl;
// 下面这行代码会报错,因为private_member在派生类中不可访问
// std::cout << "ProtectedDerived: private_member = " << private_member << std::endl;
}
};
int main() {
PublicDerived public_obj;
public_obj.display();
// 可以通过public_obj访问public_member,因为public继承使public_member在派生类中仍是public
std::cout << "Outside PublicDerived: public_member = " << public_obj.public_member << std::endl;
PrivateDerived private_obj;
private_obj.display();
// 下面这行代码会报错,因为private继承使public_member在派生类中变为private,外部无法访问
// std::cout << "Outside PrivateDerived: public_member = " << private_obj.public_member << std::endl;
ProtectedDerived protected_obj;
protected_obj.display();
// 下面这行代码会报错,因为protected继承使public_member在派生类中变为protected,外部无法访问
// std::cout << "Outside ProtectedDerived: public_member = " << protected_obj.public_member << std::endl;
return 0;
}
在上述代码中:
PublicDerived
类以public
方式继承Base
类,public_member
在PublicDerived
类中仍为public
,可被外部访问,protected_member
为protected
,只能在PublicDerived
类及其派生类中访问,private_member
不可访问。PrivateDerived
类以private
方式继承Base
类,public_member
和protected_member
在PrivateDerived
类中都变为private
,只能在PrivateDerived
类内部访问,private_member
不可访问。ProtectedDerived
类以protected
方式继承Base
类,public_member
在ProtectedDerived
类中变为protected
,protected_member
仍为protected
,都只能在ProtectedDerived
类及其派生类中访问,private_member
不可访问。同时通过main
函数展示了不同继承方式下通过派生类对象访问成员的情况。