C++--第15课 - 惊艳的继承

第15课 - 惊艳的继承

1. 继承的概念

面向对象中的继承指类之间的父子关系,子类拥有父类的所有成员变量和成员函数。子类就是一种特殊的父类,子类对象可以当作父类对象使用,子类可以拥有父类没有的方法和属性。

如下面的程序:

#include <cstdlib>

#include <iostream>

using namespace std;

class Parent

{

private:

int a;

public:

Parent()

{

a = 1000;

}

void print()

{

cout<<"a = "<<a<<endl;

}

};

class Child : Parent  //chlid继承的a和print函数变成了私有的。

{

};

int main(int argc, char *argv[])

{

Parent parent;

Child child;

parent.print();

//child.print();

cout << "Press the enter key to continue ...";

cin.get();

return EXIT_SUCCESS;

}

2. 深入了解继承

继承时的访问级别设定会影响到成员的访问级别。

class Child : Parent

{

};

等价于:

class Child :private Parent

{

};

注意:

C++中class的继承默认为private继承。

private继承的子类拥有父类的所有成员。

private继承使得父类的所有成员在子类中变为private成员。

l  public继承

父类成员在子类中保持原有访问级别。

l  private继承

父类成员在子类中变为private成员。

为子类添加新的成员:

#include <cstdlib>

#include <iostream>

using namespace std;

class Parent

{

private:

int a;

public:

Parent()

{

a = 1000;

}

void print()

{

cout<<"a = "<<a<<endl;

}

};

class Child : public Parent

{

private:

int b;

public:

void set(int a, int b)

{

this->a = a;

this->b = b;

}

};

int main(int argc, char *argv[])

{

Parent parent;

Child child;

parent.print();

child.print();

cout << "Press the enter key to continue ...";

cin.get();

return EXIT_SUCCESS;

}

以上这个程序在运行的时候会出错,显示int a是private的。我们于是开始思考下面的问题:

类成员的访问级别只有public和private是否足够?

3. protected关键字

protected成员可以在子类中被访问,但不能在外界被访问。

protected成员的访问权限介于public和private之间。

#include <cstdlib>

#include <iostream>

using namespace std;

class Parent

{

protected:

int a;

public:

Parent()

{

a = 1000;

}

void print()

{

cout<<"a = "<<a<<endl;

}

};

class Child : public Parent

{

protected:

int b;

public:

void set(int a, int b)

{

this->a = a;

this->b = b;

}

};

int main(int argc, char *argv[])

{

Parent parent;

Child child;

parent.print();

child.print();

cout << "Press the enter key to continue ...";

cin.get();

return EXIT_SUCCESS;

}

运行结果:

a = 1000

a = 1000

4. 继承与访问级别

需要被外界访问的成员直接设置为public。

只能在当前类中访问的成员设置为private。

只能在当前类和子类中访问的成员设置为protected。

private成员在子类中依然存在,但是却无法访问到。

公式:继承成员对外的访问属性= Max{ 继承方式, 父类成员访问级别 }

5. 继承与访问级别深度实践

#include <cstdlib>

#include <iostream>

using namespace std;

class A

{

private:

int a;

protected:

int b;

public:

int c;

A()

{

a = 0;

b = 0;

c = 0;

}

void set(int a, int b, int c)

{

this->a = a;

this->b = b;

this->c = c;

}

};

class B : public A

{

public:

void print()

{

cout<<"a = "<<a;  //error ,private

cout<<"b = "<<b;  //right

cout<<"c = "<<endl;  // right

}

};

class C : protected A

{

public:

void print()

{

cout<<"a = "<<a;  // error ,private

cout<<"b = "<<b;  //

cout<<"c = "<<endl;  //

}

};

class D : private A

{

public:

void print()

{

cout<<"a = "<<a; // error

cout<<"b = "<<b;

cout<<"c = "<<endl;

}

};

int main(int argc, char *argv[])

{

A aa;

B bb;

C cc;

D dd;

aa.c = 100;

bb.c = 100;

cc.c = 100;  //reeor

dd.c = 100;  //error

aa.set(1, 2, 3);

bb.set(10, 20, 30);

cc.set(40, 50, 60);  //error

dd.set(70, 80, 90); //error

bb.print();

cc.print();

dd.print();

cout << "Press the enter key to continue ...";

cin.get();

return EXIT_SUCCESS;

}

小结:

继承是一种类之间的关系,子类是一种特殊的父类。

子类通过继承可以得到父类的所有成员。

private成员可以被子类继承但不能被子类访问。

protected成员只能在当前类和子类中被访问。

不同的继承方式可能改变继承成员的访问属性。

原文地址:https://www.cnblogs.com/free-1122/p/11336216.html

时间: 2024-10-06 06:23:04

C++--第15课 - 惊艳的继承的相关文章

【C++第九课】---惊艳的继承

一.继承的概念 1.面向对象中的继承指类之间的父子关系 2.子类拥有父类的所有成员变量和成员函数 3.子类就是一种特殊的父类 4.子类对象可以当作父类对象使用 5.子类可以拥有父类没有的方法和属性 继承小实例: #include <iostream> #include <stdio.h> using namespace std; class Parent { private: int i; public: Parent() { i= 100; } }; class Child:Pa

从未如此惊艳!你好,SuperTextView

欢迎使用 SuperTextView,这篇文档将会向你展示如何使用这个控件来提高你构建项目的效率. SuperTextView 继承自 TextView,它能够大量的减少布局的复杂程度,并且使得一些常见的效果变得十分容易实现且高效.同时,它内置了动画驱动,你只需要合理编写Adjuster,然后startAnim()就可以看到预期的动画效果.它仅仅是一个控件,所以你可以不费吹灰之力的在你的项目中集成使用. 2 特点 你从此不必再为背景图编写和管理大量<shape>文件了. 重新优化的状态图功能使

20款惊艳的矢量花纹素材

1.三款时尚花卉花纹矢量图免费下载 查看内容>>下载>> 2.光芒四射的金色花纹背景矢量图 查看内容>>下载>> 3.怀旧风格的花纹边框矢量图 查看内容>> 下载>> 4.四款时尚欧式边框矢量图 查看内容>>  下载>> 5.三款漂亮的紫藤花边边框矢量图 查看内容>> 下载>> 6.一款精美的心形花边素材矢量图 查看内容>> 下载>> 7.两款彩色线条素材矢量图

大数据Spark蘑菇云前传第15课:Scala类型参数编程实战及Spark源码鉴赏(学习笔记)

前传第15课:Scala类型参数编程实战及Spark源码鉴赏 本課課程: Spark源码中的Scala类型系統的使用 Scala类型系統编程操作实战 Spark源码中的Scala类型系統的使用 classOf[RDD[_]] 這個也是类型系統 這里的意思是說 B 這種類型必需至少是 A 這樣類型 Ordering Scala类型系統编程操作实战 作為類型系統最大的就可以對類型進行限制,在Scala 中的類型系統,他本身也作為對象.e.g. 我們可以建立 Person 這個類,現在可以建立一個什麼

惊艳的cygwin——Windows下的Linux命令行环境的配置和使用

http://www.tuicool.com/articles/2MramqI 时间 2014-07-29 09:28:36  点滴之间 聚沙成金 原文  http://www.path8.net/tn/archives/6021 主题 CygwinLinux命令 本文内容遵从 CC版权协议 , 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://oldratlee.com/post/2012-12-22/stunning-cygwin N年前倒腾过一次 

迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)【转载】

转自: DBAplus社群 http://www.toutiao.com/m5762164771/ 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上) - 今日头条(TouTiao.com)http://toutiao.com/a6300616158581604609/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=4592472790&

阿里云黄海宇:窄带高清2.0——让直播更惊艳的魔术

摘要: 2018年4月11-12日,2018亚太CDN峰会在北京隆重召开,大会由亚太CDN领袖论坛.电视云论坛.短视频论坛.视频云论坛.新技术论坛.运营商论坛.国际云论坛等7大部分组成.在视频云论坛上,阿里云视频云高级算法专家黄海宇作了题为<窄带高清2.0--让直播更惊艳的魔术>的主题致辞. 2018年4月11-12日,2018亚太CDN峰会在北京隆重召开,大会由亚太CDN领袖论坛.电视云论坛.短视频论坛.视频云论坛.新技术论坛.运营商论坛.国际云论坛等7大部分组成.在视频云论坛上,阿里云视频

【Java】反射调用与面向对象结合使用产生的惊艳

缘起 我在看Spring的源码时,发现了一个隐藏的问题,就是父类方法(Method)在子类实例上的反射(Reflect)调用. 初次看到,感觉有些奇特,因为父类方法可能是抽象的或私有的,但我没有去怀疑什么,这可是Spring的源码,肯定不会有错. 不过我去做了测试,发现确实是正确的,那一瞬间竟然给我了一丝的惊艳. 这其实是面向对象(继承与重写,即多态)和反射结合的产物.下面先来看测试,最后再进行总结. 友情提示:测试内容较多,不过还是值得一看. 具体方法的继承与重写 先准备一个父类,有三个方法,

Spark3000门徒第15课RDD创建内幕彻底解密总结

今晚听了王家林老师的第15课RDD创建内幕彻底解密,课堂笔记如下: Spark driver中第一个RDD:代表了Spark应用程序输入数据的来源.后续通过Transformation来对RDD进行各种算子的转换实现算法 创建RDD的方法:1,使用程序中的集合创建RDD;2,使用本地文件系统创建RDD:3,使用HDFS创建RDD 4,基于DB创建RDD5,基于NoSQL,例如HBase 6,基于S3创建RDD 7,基于数据流创建RDD 不指定并行度,有多少core就用多少core,所以需要资源管