公有继承(public)
- 基类公有成员:在派生类中仍为公有成员,派生类对象可以访问,派生类的成员函数也可以访问。
- 基类私有成员:在派生类中不可访问,派生类对象和成员函数都无法直接访问。
- 基类保护成员:在派生类中变为保护成员,派生类对象不能访问,派生类的成员函数可以访问。
#include <iostream>
class Base {
public:
int public_member;
protected:
int protected_member;
private:
int private_member;
};
class PublicDerived : public Base {
public:
void display() {
std::cout << "Public member: " << public_member << std::endl;
std::cout << "Protected member: " << protected_member << std::endl;
// std::cout << "Private member: " << private_member << std::endl; // 编译错误
}
};
int main() {
PublicDerived pd;
pd.public_member = 10;
pd.display();
// pd.protected_member = 20; // 编译错误
// pd.private_member = 30; // 编译错误
return 0;
}
私有继承(private)
- 基类公有成员:在派生类中变为私有成员,派生类对象不能访问,派生类的成员函数可以访问。
- 基类私有成员:在派生类中不可访问,派生类对象和成员函数都无法直接访问。
- 基类保护成员:在派生类中变为私有成员,派生类对象不能访问,派生类的成员函数可以访问。
#include <iostream>
class Base {
public:
int public_member;
protected:
int protected_member;
private:
int private_member;
};
class PrivateDerived : private Base {
public:
void display() {
std::cout << "Public member: " << public_member << std::endl;
std::cout << "Protected member: " << protected_member << std::endl;
// std::cout << "Private member: " << private_member << std::endl; // 编译错误
}
};
int main() {
PrivateDerived pd;
// pd.public_member = 10; // 编译错误
pd.display();
// pd.protected_member = 20; // 编译错误
// pd.private_member = 30; // 编译错误
return 0;
}
保护继承(protected)
- 基类公有成员:在派生类中变为保护成员,派生类对象不能访问,派生类的成员函数可以访问。
- 基类私有成员:在派生类中不可访问,派生类对象和成员函数都无法直接访问。
- 基类保护成员:在派生类中仍为保护成员,派生类对象不能访问,派生类的成员函数可以访问。
#include <iostream>
class Base {
public:
int public_member;
protected:
int protected_member;
private:
int private_member;
};
class ProtectedDerived : protected Base {
public:
void display() {
std::cout << "Public member: " << public_member << std::endl;
std::cout << "Protected member: " << protected_member << std::endl;
// std::cout << "Private member: " << private_member << std::endl; // 编译错误
}
};
int main() {
ProtectedDerived pd;
// pd.public_member = 10; // 编译错误
pd.display();
// pd.protected_member = 20; // 编译错误
// pd.private_member = 30; // 编译错误
return 0;
}