继承

1)继承是面向对象程序设计实现软件重用的重要方法。程序猿能够在已有基类的基础上定义新的派生类。

2) 单继承的派生类仅仅有一个基类。多继承的派生类有多个基类。

3) 派生类对基类成员的訪问由继承方式和成员性质决定。

4) 创建派生类对象时,先调用基类构造函数初始化派生类中的基类成员。调用析构函数的次序和调用构造函数的次序相反。

5)C++提供虚继承机制,防止类继承关系中成员訪问的二义性。

6) 多继承提供了软件重用的强大功能。也添加了程序的复杂性。

派生类类成员訪问级别

1、须要被外界訪问的成员直接设置为public

2、仅仅能在当前类中訪问的成员设置为private

3、仅仅能在当前类和子类中訪问的成员设置为protected。protected成员的訪问权限介于public和private之间。

//类的继承方式对子类对外訪问属性影响

#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; //err
cout<<"b = "<<b;
cout<<"c = "<<endl;
}
}; class C : protected A
{
public:
void print()
{
//cout<<"a = "<<a; //err
cout<<"b = "<<b;
cout<<"c = "<<endl;
}
}; class D : private A
{
public:
void print()
{
//cout<<"a = "<<a; //err
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
}; int main_01(int argc, char *argv[])
{
A aa;
B bb;
C cc;
D dd; aa.c = 100; //ok
bb.c = 100; //ok
//cc.c = 100; //err 类的外部是什么含义
//dd.c = 100; //err aa.set(1, 2, 3);
bb.set(10, 20, 30);
//cc.set(40, 50, 60); //ee
//dd.set(70, 80, 90); //ee bb.print();
cc.print();
dd.print(); system("pause");
return 0;
}

类型兼容性原则

子类对象能够当作父类对象使用

子类对象能够直接赋值给父类对象

子类对象能够直接初始化父类对象

父类指针能够直接指向子类对象

父类引用能够直接引用子类对象

#include <cstdlib>
#include <iostream> using namespace std; //子类就是特殊的父类
class Parent03
{
protected:
const char* name;
public:
Parent03()
{
name = "Parent03";
} void print()
{
cout<<"Name: "<<name<<endl;
}
}; class Child03 : public Parent03
{
protected:
int i;
public:
Child03(int i)
{
this->name = "Child2";
this->i = i;
}
}; int main()
{
Child03 child03(1000);
//分别定义父类对象 父类指针 父类引用 child
Parent03 parent = child03;
Parent03* pp = &child03;
Parent03& rp = child03; parent.print();
pp->print();
rp.print();
system("pause");
return 0;
}

继承中构造和析构

在子类对象构造时。须要调用父类构造函数对其继承得来的成员进行初始化

在子类对象析构时。须要调用父类析构函数对其继承得来的成员进行清理

#include <cstdlib>
#include <iostream>
using namespace std; class Parent04
{
public:
Parent04(const char* s)
{
cout<<"Parent04()"<<" "<<s<<endl;
} ~Parent04()
{
cout<<"~Parent04()"<<endl;
}
}; class Child04 : public Parent04
{
public:
Child04() : Parent04("Parameter from Child!")
{
cout<<"Child04()"<<endl;
} ~Child04()
{
cout<<"~Child04()"<<endl;
}
}; void run04()
{
Child04 child;
} int main_04(int argc, char *argv[])
{
run04(); system("pause");
return 0;
}

1、子类对象在创建时会首先调用父类的构造函数

2、父类构造函数运行结束后,运行子类的构造函数

3、当父类的构造函数有參数时,须要在子类的初始化列表中显示调用

4、析构函数调用的先后顺序与构造函数相反

继承中的同名成员变量

1、当子类成员变量与父类成员变量同名时

2、子类依旧从父类继承同名成员

3、在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符)

4、同名成员存储在内存中的不同位置

c++继承总结的更多相关文章

  1. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

  2. JavaScript的继承实现方式

    1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...

  3. javascript中的继承与深度拷贝

    前言 本篇适合前端新人,下面开始...... 对于前端新手来说(比如博主),每当对js的对象做操作时,都是一种痛苦,原因就是在于对象的赋值是引用的传递,并非值的传递,虽然看上去后者赋值给了前者,他们就 ...

  4. 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  5. JS继承类相关试题

    题目一: //有关于原型继承的代码如下:function Person(name) {   this.name = name;}Person.prototype = {     getName : f ...

  6. JS继承之寄生类继承

    原型式继承 其原理就是借助原型,可以基于已有的对象创建新对象.节省了创建自定义类型这一步(虽然觉得这样没什么意义). 模型 function object(o){ function W(){ } W. ...

  7. JS继承之借用构造函数继承和组合继承

    根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...

  8. JS继承之原型继承

     许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...

  9. 深入浅出JavaScript之原型链&继承

    Javascript语言的继承机制,它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instanc ...

  10. 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型

    前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.

随机推荐

  1. webpack2 热加载js 文件

    如果只要普通的热加载 只要如下配置就好了 package.json { "devDependencies": { "webpack": "^2.6.1 ...

  2. [BZOJ4709][JSOI2011]柠檬(斜率优化DP)

    显然选出的每一段首尾都是相同的,于是直接斜率优化,给每个颜色的数开一个单调栈即可. #include<cstdio> #include<vector> #include< ...

  3. Codeforces Round #450 (Div. 2) ABCD

    这次还是能看的0 0,没出现一题掉分情况. QAQ前两次掉分还被hack了0 0,两行清泪. A. Find Extra One   You have n distinct points on a p ...

  4. java浏览器控件jxbrowser(简单demo模拟自动登录与点击)

    写在前面: 老大让我写个脚本自动给他写dms有一段时间了,说实话当时不知道老大指的这个脚本是什么?毕竟是做web的,难道是写个数据库sql语句脚本吗?也就放在了一边.巧了,最近一个朋友说他之前写了个程 ...

  5. React 16 升级时遇到的一个坑,分享一下

    遇到的坑 今天在跟着dva.js官网上面的一个教程写东西的时候,照着教程上面的代码写之后,运行总是报错:TypeError: Cannot read property 'object' of unde ...

  6. 102.愤怒的LJF

    2841 愤怒的LJF  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description LJF发现ZPC的积分比他高,他很愤 ...

  7. CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂

    772002画马尾 题目连接: http://acm.uestc.edu.cn/#/problem/show/1280 Description 众所周知772002很喜欢马尾,所以他决定画几幅马尾送给 ...

  8. Nios II uCLinux/Linux启动分析

    1. 说明 本文采用的Linux源码版本来自Altera公司FTP.不考虑zImage生成的Compress过程.因为zImage是内核binary文件经过gzip 压缩,并在头部添加解压缩代码实现的 ...

  9. RenderMonkey 练习 第三天 【OpenGL renderToTexture】

    渲染到纹理: 1. 新建一个OpenGL 空effect; 2. 添加渲染目标纹理, Add Texture-> Add Render Texture 3. 添加一个渲染pass 4. 将pas ...

  10. 推断是否是有效的IP地址

    #include<stdio.h> #include<string.h> bool isValidIp(char *s) { int len=strlen(s); int i= ...