C++中的继承性

定义:继承性是面向对象编程的重要特性,它允许一个类(子类或派生类)继承另一个类(父类或基类)的成员变量和成员函数,以实现代码复用和层次化设计,有公有、保护和私有继承三种方式。

如何实现继承:

cpp 复制代码
    #include<iostream>
    #include<unordered_map>
    using namespace std;
    class A   //A父类、基类
    {
    public:
    	int num;
    	void fun()
    	{
    		cout << "A fun" << endl;
    	}
    };
    //继承就是通过已经存在的类创建新的类
    class B :public A   //B子类、派生类
    {
    };
    int main()
    {
    	B b;
    	b.num = 2;
    	b.fun();
    	return 0;
    }

好处:

提高代码的复用性

注意事项:

1.会出现父、子类出现同名成员

继承同名成员处理方式

访问子类同名成员: 直接访问即可

访问父类同名成员 : 需要加作用域

当父类和子类中有同名函数时,子类中的函数会将父类中的同名函数隐藏(函数隐藏)

如果此时想通过子类对象访问父类对象,需要作用域

父类对象不可以访问子类对象中的成员变量,因为创建父类对象不会创建子类对象

cpp 复制代码
#include<iostream>
#include<unordered_map>
    using namespace std;
    class A
    {
    public:
    	int num;
    	void fun()
    	{
    		cout << "A fun" << endl;
    	}
    
    	void fun(int a)
    	{
    		cout << "A int fun" << endl;
    	}
    };
    class B:public A
    {
    public:
    	int num;
    	void fun()
    	{
    		cout << "B fun" << endl;
    	}
    };
    int main()
    {
    	B b;
    	b.num = 2; //访问的是子类的成员变量
    	b.fun(); //访问的是子类的成员函数
    	b.A::num = 3; //访问的是父类的成员变量
    	b.A::fun();
    	b.A::fun(2);
    	cout << b.num << "  " << b.A::num << endl;
    	return 0;
    }

2.会出现菱形继承现象

菱形继承:

两个派生类继承同一个基类,又有某一个类同时继承这两个派生类

cpp 复制代码
#include<iostream>

using namespace std;
class A{
    public:
     int a;
        A(){
            cout<<"A构造";
                    
        }
};
class B:virtual public A//virtual为虚继承的关键字
{
    public:
        B(){
            cout<<"B构造";
                    
        }
};
class C:virtual public A//virtual为虚继承的关键字
{
    public:
        C(){
            cout<<"C构造";
                    
        }
};
class D:public A,public B//virtual为虚继承的关键字
{
   
};
int main(){
    D d;
    d.a;
    d.B::a;
    return 0;
}

总结:

菱形继承会使子类继承两份相同的数据,导致资源浪费

相关推荐
workflower8 分钟前
基本作业-管理⾃⼰的源代码
开发语言·单元测试·软件工程·需求分析·个人开发
froginwe1117 分钟前
Pandas DataFrame:深入理解数据分析的利器
开发语言
Jm_洋洋20 分钟前
【Linux系统编程】程序替换:execve(execl、execlp、execle、execv、execvp、execvpe)
linux·运维·c语言·开发语言·程序人生
冯诺依曼的锦鲤42 分钟前
算法练习:前缀和专题
开发语言·c++·算法
闭着眼睛学算法1 小时前
【双机位A卷】华为OD笔试之【哈希表】双机位A-跳房子I【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·c++·python·算法·华为od·散列表
JinSoooo1 小时前
pnpm monorepo 联调:告别 --global 参数
开发语言·javascript·ecmascript·pnpm
信仰_2739932431 小时前
枚举类Enum反编译后效果
java·开发语言
开发者驿站1 小时前
2025年保姆级C++环境配置教程(Windows/macOS双平台)
c++·windows·macos
辰尘_星启1 小时前
『CMake』关于使用CMake构建项目时的现代/传统指令
c++·架构·系统·cmake·项目·构建
AA陈超2 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-13 属性菜单 - 边框值
c++·游戏·ue5·游戏引擎·虚幻