继承

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. [Contest20171005]Maze

    考虑一个$N\times M$的网格,每个网格要么是空的,要么是障碍物.整个网格四周都是墙壁(即第$1$行和第$N$行,第$1$列和第$M$列都是墙壁),墙壁有且仅有两处开口,分别代表起点和终点.起点 ...

  2. 神勇的产品经理之路系列-10 PD三板斧

    一.三板斧的来源及理解  三板斧 古代长兵器的一种,又名“马战斧”.相传为程咬金所用.斧阔五寸,柄长七尺.用法有劈.砍.剁.搂.截.撩.云.片.推.支等. 比喻义:解决问题的方法不多,但却非常管用. ...

  3. GMT-CMSP系统维护步骤整理

    一.关闭前端各服务1.北京代理,韩国代理节点nginx/etc/init.d/nginx stop2.关闭WEB1,WEB2 NGINX和PHPpkill nginx && pkill ...

  4. Linux下KVM虚拟机基本管理及常用命令(转)

    说明:可能有重复 一.KVM的基本管理 1.查看KVM虚拟机配置文件 #Kvm虚拟机默认配置文件位置 [root@kvm qemu]# pwd /etc/libvirt/qemu [root@kvm ...

  5. UNICODE串转换成char类型串的四种方法

    1. 调用 WideCharToMultiByte() API int WideCharToMultiByte (     UINT    CodePage,                //1 U ...

  6. PHP作前端java作后台

    前两周参加完 ThinkInLamp 的 PHP 架构师大会,听鸟哥一上午的分享,感慨很多,PHP 业界虽然方向不明荒废了两三年的时间,终究还是又重新崛起了.其实包括 Java 的重启问题,现在也已经 ...

  7. php类库安装xml simplexml

    问题 报错:Call to undefined function dom_import_simplexml() yum install php-dom service restart httpd 参考 ...

  8. Ping Pod不通问题定位及Ingress验证

    Ping Pod网络问题不通定位记录 1.验证墙是否通 flannel默认使用8285端口作为UDP封装报文的端口,VxLan使用8472端口,下面命令验证一下确定其在8472端口 ip -d lin ...

  9. 轻松编写 C++ 单元测试

    单元测试概述 测试并不只是测试工程师的责任,对于开发工程师,为了保证发布给测试环节的代码具有足够好的质量( Quality ),为所编写的功能代码编写适量的单元测试是十分必要的. 单元测试( Unit ...

  10. OSG立体模式下动态修改相机远近裁剪面的实现

    1. 非立体模式下动态修改相机远近裁剪面 class GLB_DLLCLASS_EXPORT CGlbGlobeClipHandler : public osg::NodeCallback    { ...