继承的方式(C++)
2023-12-28 21:50:34
三、继承
继承,基于一个已有类创建新类,使新类与已有类具有同样的功能,即新类具有已有类相同的数据成员和成员函数。继承是代码重用的基本工具。已有类称为基类(父类 / 超类),新类称为派生类(子类)。
注意:
- 基类的构造函数和析构函数不能继承
- 基类的友元函数不能继承
- 静态数据成员和静态成员函数不能继承
3.1 继承的方式
C++的继承可以分为公有继承、保护进程和私有进程。不同继承方式会不同程度影响基类成员在派生类的访问权限。
语法格式:
class 派生类名:继承方式 基类名{
派生类成员声明与定义
};
访问控制限定符 | 访问控制属性 | 内部 | 子类 | 外部 | 友元 |
---|---|---|---|---|---|
public | 公有成员 | OK | OK | OK | OK |
protected | 保护成员 | OK | OK | NO | OK |
private | 私有成员 | OK | NO | NO | OK |
基类中 | 在公有子类中变成 | 在保护子类中变成 | 在私有子类中变成 |
---|---|---|---|
公有成员 | 公有成员 | 保护成员 | 私有成员 |
保护成员 | 保护成员 | 保护成员 | 私有成员 |
私有成员 | 私有成员 | 私有成员 | 私有成员 |
3.1.1 公有继承
继承方式为public的继承称为公有继承,在这种继承中,基类成员的访问权限在派生类中保持不变。
#include <iostream>
using namespace std;
class Base{ //基类
private:
int m_a;
protected:
int m_b;
public:
int m_c;
Base(int a = 1, int b = 2, int c = 3) {
m_a = a;
m_b = b;
m_c = c;
}
int geta(){
return m_a;
}
};
class Dervied: public Base{ //派生类
public:
void print() {
//cout << m_a << endl; //error 私有成员
cout << m_b << endl;
cout << m_c << endl;
cout << geta() << endl;
}
};
int main(void) {
Dervied test;
//cout << test.m_a << endl; //error 私有成员
//cout << test.m_b << endl; //error 保护成员
cout << test.m_c << endl;
return 0;
}
3.1.2 保护继承
#include <iostream>
using namespace std;
class Base {
private:
int m_a;
protected:
int m_b;
public:
int m_c;
Base(int a = 1, int b = 2, int c = 3) {
m_a = a;
m_b = b;
m_c = c;
}
int geta(){
return m_a;
}
};
class Dervied: protected Base{
protected:
void print() {
//cout << m_a << endl; //error private
cout << m_b << endl;
cout << m_c << endl;
cout << geta() << endl;
}
};
int main(void) {
Dervied test;
// cout << test.m_a << endl; // error private
// cout << test.m_b << endl; // error 类外不可访问 protected
// cout << test.m_c << endl; // error protected继承子类中该变量变为protected成员
// test.print(); //error protected
return 0;
}
3.2.3 私有继承
#include <iostream>
using namespace std;
class Base {
private:
int m_a;
protected:
int m_b;
public:
int m_c;
Base(int a = 1, int b = 2, int c = 3) {
m_a = a;
m_b = b;
m_c = c;
}
int geta() {
return m_a;
}
};
class Derived : private Base{
public:
void print(){
//cout << m_a << endl; //error private
cout << m_b << endl;
cout << m_c << endl;
cout << geta() << endl;
}
};
int main(void) {
Derived test;
// cout << test.m_a << endl; // error
// cout << test.m_b << endl; // error
// cout << test.m_c << endl; // error
// cout << test.geta() << endl; // error
return 0;
}
文章来源:https://blog.csdn.net/qq_36091214/article/details/135278478
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!