C++中的三种继承方式
1,被忽略的细节:
1,冒号( :)表示继承关系,Parent 表示被继承的类,public 的意义是什么?
class Parent
{ }; class Child : public Parent
{ };
2,有趣的问题:
1,是否可以将继承语句中的 public 换成 protected 或者 private?如果可以,与 public 继承有什么区别?
3,有趣的尝试编程实验:
#include <iostream>
#include <string> using namespace std; class Parent
{
}; class Child_A : public Parent
{
}; class Child_B : protected Parent
{
}; class Child_C : private Parent
{
}; int main()
{
return ;
}
1,protected 和 private 地位对等,推理的角度可以过,实际的编译结果也是同样的结论;
2,本文主要分析这三种继承方式有何不同;
4,不同的继承方式(这是父类成员在子类中被外界访问的级别):
1,C++ 中支持三种不同的继承方式;
1,public 继承:
1,父类成员在子类中保持原有访问级别;
2,private 继承:
1,父类成员在子类中变为私有成员;
3,protected 继承:
1,父类中的公有成员变为保护成员,其它成员保持不变;
2,继承成员的属性:

1,Max{继承方式,父类成员访问属性};
2,C++ 中的默认继承方式为 private;
3,继承与访问级别深度实践编程实验:
#include <iostream>
#include <string> using namespace std; class Parent
{
protected:
int m_a;
protected:
int m_b;
public:
int m_c; void set(int a, int b, int c)
{
m_a = a;
m_b = b;
m_c = c;
}
}; class Child_A : public Parent
{
public:
void print()
{
cout << "m_a" << m_a << endl;
cout << "m_b" << m_b << endl;
cout << "m_c" << m_c << endl;
}
}; class Child_B : protected Parent
{
public:
void print()
{
cout << "m_a" << m_a << endl;
cout << "m_b" << m_b << endl;
cout << "m_c" << m_c << endl;
}
}; class Child_C : private Parent
{
public:
void print()
{
cout << "m_a" << m_a << endl;
cout << "m_b" << m_b << endl;
cout << "m_c" << m_c << endl;
}
}; int main()
{
Child_A a;
Child_B b;
Child_C c; a.m_c = ;
// b.m_c = 100; // Child_B 保护继承自 Parent, 所以所有 public 成员全部变成了 protected 成员, 因此外界无法访问;
// c.m_c = 100; // Child_C 私有继承自 Parent, 所以所有的成员全部变成了 private 成员, 因此外界无法访问; a.set(, , );
// b.set(2, 2, 2); // 保护继承;
// c.set(3, 3, 3); // 私有继承; a.print(); // 继承方式只影响继承自父类成员的访问方式,外界访问子类方式无影响;
b.print(); // 继承方式只影响继承自父类成员的访问方式,外界访问子类方式无影响;
c.print(); // 继承方式只影响继承自父类成员的访问方式,外界访问子类方式无影响; return ;
}
1,父类中的访问级别影响着子类的访问,但是继承级别不影响子类的访问、影响其它外部类访问父类中的成员;
5,遗憾的事实:
1,一般而言,大型的 C++ 工程项目中只使用 public 继承;
1,这已经足够了;
2,保护继承和私有继承根本就没什么用;
2,C++ 的派生语言只支持一种继承方式(public 继承);
1,Java、C# 等语言只有一种继承方式即 public 继承方式;
3,protected 和 private 继承带来的复杂性远大于实用性;
1,仅在学术研究领域研究;
6,C++ 派生语言初探编程实验:
1,D 语言(在 Linux 中用 gdc 编译,生成 *.out 文件):
module D_Demo; // 将下面的所有代码定义为模块,模块名字为
D_Demo; import std.stdio; // import 同 include
import std.string; // import 同 include class Obj // 这里定义了一个 Obj 类
{
protected:
string mName;
string mInfo; public:
this() // 这是 D 语言中的构造函数,D 语言中的构造函数统一的用 this 这个关键字表示,由 C++ 进化而来;
{
mName = "Object";
mInfo = "";
} string name() // 定义两个成员函数;
{
return mName;
} string info()
{
return mInfo;
}
} class Point : Obj // 定义了一个类 Point,其继承自 Obj,D 语言中的继承方式默认的是 public 继承;
{
private:
int mX;
int mY; public:
this(int x, int y)
{
mX = x;
mY = y;
mName = "Point";
mInfo = format("P(%d, %d)", mX, mY); // 和 C 语言中的语法规则一样;
} int x()
{
return mX;
} int y()
{
return mY;
}
} void main(string[] args) // 程序运行的入口;
{
writefln("D Demo"); // D Demo;打印语句之后空一行,同 printf; Point p = new Point(, ); // 动态生成 Point 对象; writefln(p.name()); // Point,公有继承;
writefln(p.info()); // P(1, 2),公有继承;
}
1,没学过 D 语言,但是要读懂 D 语言的代码是比较容易的;
2,如果因工作需要要学习 D 语言程序设计,将是轻而易举的事情;
2,C# 语言(Linux 中用 gmcs 编译,生成 *.exe 文件):
class Obj // 定义一个类 Obj;
{
protected string mName; // 访问属性 protected;
protected string mInfo; public Obj() // 无返回值,函数名同类名,即构造函数,访问属性为 public;
{
mName = "Object";
mInfo = "";
} public string name()
{
return mName;
} public string info()
{
return mInfo;
}
} class Point : Obj // 定义一个类 Point,继承自 Obj,只有一种 public 继承方式;
{ private int mX;
private int mY; public Point(int x, int y) // 构造函数;
{
mX = x;
mY = y;
mName = "Point";
mInfo = "P(" + mX + ", " + mY + ")"; // 通过 + 操作符来连接字符串和整型变量,最终得到一个字符串;C++ 中可以通过重载全局的 + 操作符就能够连接一个字符串和一个整型变量最终得到一个字符串,别的语言中的特性,不明白的话,考虑下在 C++ 中如何实现;
} public int x()
{
return mX;
} public int y()
{
return mY;
}
} class Program
{
public static void Main(string[] args) // 程序入口
{
System.Console.WriteLine("C# Demo"); // C# Demo Point p = new Point(, ); System.Console.WriteLine(p.name()); // Point
System.Console.WriteLine(p.info()); // P(1, 2) }
}
3,Java 程序:
class Obj
{
protected String mName;
protected String mInfo; public Obj()
{
mName = "Object";
mInfo = "";
} public String name()
{
return mName;
} public String info()
{
return mInfo;
}
} class Point extends Obj // extends 表示公有继承,更加直观;
{ private int mX;
private int mY; public Point(int x, int y)
{
mX = x;
mY = y;
mName = "Point";
mInfo = "P(" + mX + ", " + mY + ")";
} public int x()
{
return mX;
} public int y()
{
return mY;
}
} class Program {
public static void main(String[] args){ // 程序运行如口
System.out.println("Java Demo"); // Java Demo Point p = new Point(1, 2); System.out.println(p.name()); // Point
System.out.println(p.info()); // P(1, 2)
}
}
1,现在已经有能力读懂 D、C#、Java 语言程序了;
1,C#、Java 可以从事网络开发、游戏开发;
2,D 语言可以从事系统开发;
2,工程里面,仅仅使用 public 继承就够了;
7,小结:
1,C++ 中支持 3 种不同的继承方式;
2,继承方式直接影响父类成员在子类中的访问属性;
3,一般而言,工程中只使用 public 的继承方式;
4,C++ 的派生语言中只支持 public 继承方式;
C++中的三种继承方式的更多相关文章
- C++ 中三种继承方式的理解
一.公有继承(public inheritance) 1.概念:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可以直接访问. 实验一下: 我们用代 ...
- js的三种继承方式及其优缺点
[转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...
- C++的三种继承方式简述
C++对父类(也称基类)的继承有三种方式,分别为:public继承.protected继承.private继承.三种继承方式的不同在于继承之后子类的成员函数的"可继承性质". 在说 ...
- C++继承(一) 三种继承方式
继承定义 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一. 继承就是不修改原有的类,直接利用原来的类的属性和方法并进行扩展.原来的类称为基类,继承的类称为派生类,他们的关系就像父子 ...
- c++三种继承方式public,protect,private
C++中的三种继承public,protected,private 三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员 ...
- C++中的三种继承关系
C++中的三种继承关系 先看类中声明成员时的三种访问权限 public : 可以被任意实体访问 protected : 只允许子类及本类的成员函数访问 private : 只允许本类的成员函数访问 在 ...
- js oop中的三种继承方法
JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方 ...
- C++中的三种继承public,protected,private
( c++默认class是private继承且class内的成员默认都是private struct 默认位public 继承,struct内成员默认是public ) 三种访问权限 public: ...
- C++三种继承方式
一.三种继承方式 继承方式不同,第一个不同是的是派生类继承基类后,各成员属性发生变化.第二个不同是派生类的对象能访问基类中哪些成员发生变化.表格中红色标注.
随机推荐
- [LOJ3120][CTS2019|CTSC2019]珍珠:生成函数+NTT
分析 容易发现\(D \leq n - 2m\)时,任意数列都满足要求,直接判掉,下文所讨论的均为\(D > n - 2m\)的情况. 考虑把两个数列合并,显然可以认为是两个带标号对象的合并,可 ...
- 解决idea无法显示中文候选框问题
第一:先找到idea安装目录,找到文件jre64,把它命名为“jre642”,也可以随意命名 第二步:找到Javaan安装目录下的jre ,把它复制到idea安装目录下,命名为“jre64”. 第三 ...
- 关于Jdk7与Jdk8对Collections进行分组的区别
先准备一点数据: public class User { private Integer id; private String type; private String name; ...
- eclipse中把选中的代码全部变成大写或者小写的快捷键
Ctrl+shift+x是把选中的变成大写 Ctrl+shift+y是把选中的变成小写
- docker-compose常用命令(持续更新...)
build 构建或重建服务 help 命令帮助 kill 杀掉容器 logs 显示容器的输出内容 port 打印绑定的开放端口 ps 显示容器 pull 拉取服务镜像 restart 重启服务 rm ...
- 十四周学习总结&简易记事本
学习总结: 一.JDBC: 1.JDBC提供里一套与平台无关的标准数据库操作接口和类,只要支持java的数据库厂商,所提供的数据库都可以以使用JDBC操作. 2.JDBC的主要操作类及接口: 3.JD ...
- readyState xhr对象当前状态
var request=new XMLHttpRequest(); request.open("GET","get.php",true); request.se ...
- jquery 四舍五入小数处理总结
一.jquery中对小数进行取整.四舍五入的方法 1.丢弃小数部分,保留整数部分 parseInt(5/2) =2 2.四舍五入. Math.round(5/2) =3 3.向下取整 Math.flo ...
- ansible 剧本进阶 角色
主要内容: playbook(剧本) roles 一.查看收集到的信息 ansible cache -m setup setup (需要了解的参数) ansible_all_ipv4_addresse ...
- leetcode 166分数到小数
手动排除特殊情况: 对于一般情况,使用位运算和加减法来计算除法,使用sign记录结果符号:(这部分为leetcode 29题的答案) 使用hashmap来记录循环体出现的开始位置(如果有的话),使用f ...