C++是一门面向对象的编程语言,其中的派生机制是其重要的面向对象特性之一。派生是建立在现有类的基础之上,创建一个新的类的过程。在新类中,可以利用父类中定义的变量和方法,并且可以添加新的成员变量和方法。
下面我们来详细地学习C++中的派生机制。
C++支持以下几种派生类型:
(资料图片)
1.公有派生: 在公有派生中,派生类可以访问基类中的公有成员和受保护成员,但不能访问基类中的私有成员。公有派生通常用于向基类添加新的特征和行为。
示例代码如下:
class Base { public: int public_var; protected: int protected_var; private: int private_var; }; class Derived : public Base { public: void setVar(int a, int b, int c) { public_var = a; //公有成员可以在派生类中访问 protected_var = b; //受保护成员可以在派生类中访问 // private_var = c; //私有成员无法在派生类中访问 } };
2.保护派生: 在保护派生中,派生类可以访问基类中的公有成员和受保护成员,但不能访问基类中的私有成员。保护派生通常用于继承,即将基类的所有成员和方法都继承到派生类中。
示例代码如下:
class Base { public: int public_var; protected: int protected_var; private: int private_var; }; class Derived : protected Base { public: void setVar(int a, int b, int c) { public_var = a; //公有成员可以在派生类中访问 protected_var = b; //受保护成员可以在派生类中访问 // private_var = c; //私有成员无法在派生类中访问 } };
3.私有派生: 在私有派生中,派生类可以访问基类中的公有成员和受保护成员,但不能访问基类中的私有成员。私有派生通常用于“隐藏”继承,即对基类进行改进或扩展,但不公开基类的接口。
示例代码如下:
class Base { public: int public_var; protected: int protected_var; private: int private_var; }; class Derived : private Base { public: void setVar(int a, int b, int c) { public_var = a; //公有成员可以在派生类中访问 protected_var = b; //受保护成员可以在派生类中访问 // private_var = c; //私有成员无法在派生类中访问 } };
在C++中,派生的语法为:
class Derived_class : access_specifier Base_class { // 包含新成员和覆盖的函数等 };
其中,Derived_class 是基于 Base_class 的派生类。access_specifier 表示派生类型,可以是 public、protected 或 private。新的成员和覆盖的函数等是指在派生类中添加的成员和方法。
示例代码如下:
class Base { public: void print() { std::cout << "Base" << std::endl; } }; class Derived : public Base { public: void print() { std::cout << "Derived" << std::endl; } }; int main() { Base b; Derived d; b.print(); //输出 Base d.print(); //输出 Derived return 0; }
上述代码中,Base 类中定义了一个 print() 方法,输出 Base。Derived 类继承自 Base 类,并定义了一个同名的 print() 方法,输出 Derived。在 main 函数中,分别创建了 Base 类和 Derived 类的对象并分别调用了它们的 print() 方法。结果显示,派生类覆盖了其基类的同名方法。
C++还支持多重继承,即一个派生类从多个基类派生而来。具体地,可以这样建立一个派生类:
class Derived : access_specifier Base1, access_specifier Base2, ... { // 包含新成员和覆盖的函数等 };
其中,Derived 是一个派生类,Base1、Base2 是两个基类,可以有多个基类。access_specifier 表示该基类在派生类中的访问权限,可以是 public、protected 或 private。
示例代码如下:
class Base1 { public: void print1() { std::cout << "Base1" << std::endl; } }; class Base2 { public: void print2() { std::cout << "Base2" << std::endl; } }; class Derived : public Base1, protected Base2 { public: void print() { print1(); //print2(); //private 成员不能在派生类之外的成员函数中访问 } }; int main() { Derived d; d.print(); return 0; }
上述代码中,定义了两个基类 Base1 和 Base2,分别有各自的方法 print1() 和 print2()。派生类 Derived 继承自 Base1 和 Base2,由于 Base2 的访问权限设置为 protected,在 Derived 中,只有成员函数可以访问 Base2 中的成员。Derived 中定义的 print() 方法分别调用了 Base1 和 Base2 中的方法,结果显示,多重继承能够在派生类中同时使用多个基类的成员,并进行灵活的访问权限设置。
当一个类同时从多个基类继承,而这些基类中又有共同的基类时,就会出现“二义性”的问题。为了解决这个问题,C++引入了虚继承机制。
虚继承使用关键字 virtual,它告诉编译器,在继承链中只保留一份共同的基类,从而避免了多次继承造成的冗余。另外,虚继承还规定了一个虚基类列表。虚基类列表中的类在继承链中只继承一次,并且会在最深层的派生类中进行初始化。
示例代码如下:
class Root { public: int i; }; class A : public virtual Root { public: int j; }; class B : public virtual Root { public: int k; }; class C : public A, public B { public: void sum() { i = j + k; } }; int main() { C c; c.j = 10; c.k = 20; c.sum(); std::cout << "Sum of j and k is " << c.i << std::endl; return 0; }
上述代码中,定义了一个基类 Root,和两个继承了 Root 的派生类 A 和 B。类 C 同时从 A 和 B 继承,它将 A 和 B 中的 i 合并为一份,并且在最深层的派生类 C 中进行初始化。在 main 函数中,我们创建了类 C 的对象 c,并对它的成员变量 j 和 k 赋值,并通过 sum() 方法计算它们的和。
派生类和基类之间存在以下关系:
派生类包含的成员都是派生类自己定义的,但它可以访问基类的公有成员和受保护成员,也可以使用基类中的方法。派生类的对象中包含了基类的对象,即派生类的对象中包含了基类对象的成员。派生类的对象可以被看作是基类的对象,即派生类的对象可以直接赋值给基类对象。示例代码如下:
class Base { public: int publicVar; protected: int protectedVar; private: int privateVar; public: void print() { std::cout << "publicVar: " << publicVar << std::endl; std::cout << "protectedVar: " << protectedVar << std::endl; std::cout << "privateVar: " << privateVar << std::endl; } }; class Derived : public Base { public: int additionalVar; public: void printAdditionalVar() { std::cout << "additionalVar: " << additionalVar << std::endl; } }; int main() { Derived derived; derived.publicVar = 1; //derived.protectedVar = 2; //protected 成员不能直接在类外部访问 derived.print(); //基类中的公有成员和受保护成员可以在派生类对象中访问 derived.additionalVar = 3; derived.printAdditionalVar(); //派生类中的成员可以直接访问 Base& base = derived; //派生类的对象可以赋值给基类对象 base.print(); //基类中的成员可以在基类对象中访问 return 0; }
上述代码中,定义了一个基类 Base 和一个派生类 Derived。在 main 函数中,我们首先创建了一个 Derived 的对象 derived,可以看到它可以访问由其基类 Base 中继承的成员变量和方法。同时,我们为 derived 对象中定义了一个 additionalVar 成员,并定义了一个打印 additionalVar 的方法。接着,我们将 derived 对象赋值给了一个 Base 类型的引用 base,并通过 base 访问了 Base 类中的成员变量和方法。结果显示了派生类和基类之间的关系。
本文介绍了C++中的派生机制,包括公有派生、保护派生、私有派生、多重继承和虚继承等。同时,文章还介绍了派生类和基类之间的关系。理解并掌握派生机制,可以提高我们在C++编程中的应用技能。
到此这篇关于一文带你学习C++中的派生机制的文章就介绍到这了,更多相关C++派生机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
标签:
精彩推荐
1、在游戏大厅里里面就可以设置的,具体步骤如下。2、1 登入游戏客户端(开启QT内置语音)。3、2 进入...
在成本控制和产品优化这两个方面,朱晓彤不光分担了马斯克的痛苦,从某种程度上说,他还超越了马斯克的...
4月12日,澎湃新闻记者从复旦大学获悉,曾入选华为“天才少年”项目,第一代智能驾驶系统的核心技术专家...
天津钢管公司中学2023年招收足球特长生的通知为贯彻《天津市教委关于促进中小学体育后备人才培养》的文...
海口湾演艺中心演出汇总1 笑果脱口秀城市漫游@海口0411-0412时间:2023 04 12周三场馆:海口市|海口...
一、现在孩子抚养费应该给多少钱现在孩子抚养费应该给多少钱,需要具体分析:1 有固定收入的抚育费一般...
“之前因为第一套住房贷款尚未结清,购买第二套住房暂不满足公积金贷款条件,只能在工商银行办理个人住...
4月12日,上海市教委公布《关于做好2023年本市学前教育阶段适龄幼儿入园工作的通知》。今年上海学前教育...
路透社10日援引联合国的数据报道称,本月中下旬,印度的人口规模将超过14亿,并成为世界上人口最多的国...
近几年,直播行业乘风而起,网红主播的高薪也吸引不少年轻人加入电商主播大军。然而近期市场却传出,电...
顺昌县气象台发布雷电黄色预警【Ⅲ级 较重】
1、如果不知道怎么算,可以打开支付宝输入[,点击[]进入。2、然后选择[]进行计算。3、根据贷款是[]还是[...
中国日报4月11日电(记者孙晓晨)在刚刚过去的周末,美国职业棒球大联盟(MLB)携手Keep酷运动实验室,...
1、同安公主同安公主,唐世祖元皇帝李昞女,生母元贞皇后独孤氏,唐高祖李渊的同母妹。2、嫁有唐一代第...
4月11日,中洲控股公告显示,公司第九届第十三次董事会会议于2023年4月10日以现场方式召开,会议通过了...
晶澳科技(002459)2022年年报点评:盈利能力持续超预期2023年迎量利双升
西安最新限购政策一、持续实行限购政策1、西安限购区域新城区、碑林区、莲湖区、雁塔区、灞桥区、未央区...
极目新闻记者余渊视频剪辑余渊00:084月10日,有网友发布视频称,一名男子站在山东威海猫头山一处近乎垂...
世界乒乓球职业大联盟(WTT)新乡冠军赛10日在河南新乡进行了第二个比赛日较量。中国选手梁靖崑以3:1战胜...
外交部发言人汪文斌11日宣布:应乌兹别克斯坦代外长赛义多夫邀请,国务委员兼外长秦刚将于4月12日至13日...
摘要纸黄金周一(4月10日)日K收跌。美市尾盘,纸黄金收报440 03元 克,下跌0 72%,日内最高上探443 2...
阳光照明(600261)04月11日在投资者关系平台上答复了投资者关心的问题。
多位银行人士在接受记者采访时称,此次下调并非全国性新一轮存款降息,而是中小银行对去年9月全国性银行...
1、特殊书面形式,法律行为书面形式的一种。2、当事人的意思表示除用文字记载外,还应取得国家机关认可...
除螨喷剂可以对除螨起一定的效果。来自于日本的UYEKI是比较经常用的除螨虫喷剂,是一种可用于棉被防螨处...
资讯News
06-20
11-03
11-03
11-03
11-03
11-03
11-03
11-03
11-03
11-03
11-03
聚焦Policy
当好农民工的“护薪人” 近日,罗某等7名农民工在收到被拖欠的工资后,纷纷打电话向江西省南昌市...
“通讯录里所有人都知道我欠钱了” □ 本报记者 韩丹东 □ 本报见习记者 张守坤 ...
大连宝马车撞人案肇事司机被判死刑 本报讯 记者韩宇 10月29日,辽宁省大连市中级人民法院一审...
医院财务迷上网络赌博输光5000万元公款 □ 本报记者 马维博 □ 本报通讯员 汪宇堂 曹...
辊环车削 雕琢毫厘(工匠绝活) 【绝活看点】 23年来,雷虎始终扎根一线,改进钢材轧制工艺...
交警严查超标电动自行车挪用“白牌” 截至昨晚6时,处罚电动自行车违法行为共计6585笔;下一步将...
明起寒潮来袭 北方气温普降10℃以上 中央气象台预计,本周日北京平原地区最低气温降至-4℃左右...
多种蔬菜价格降幅达五成 包括菠菜、蒿子秆等 预计本月中旬蔬菜恢复供需平衡 本报讯(记者...
北京周日最低气温或达-4℃ 本报讯(记者 赵婷婷)北京青年报记者昨天从中央气象台获悉,新一股...
昌平一家四口确诊新冠肺炎 天通北苑第二社区升级为中风险地区 朝阳两涉疫校区及16所学校停课 ...