c++之旅:继承
继承
继承有关于权限的继承,多继承和虚继承
权限继承
权限继承有公有继承,保护继承和私有继承
公有继承
公有继承可以继承父类的public和protected属性和方法
#include <iostream>
#include <string>
using std::string;
class Person {
public:
int age;
private:
string name;
protected:
bool sex;
};
class Worker:public Person {
};
Person类中的age和sex将会被Work类继承下来,而name由于是私有属性,无法被继承。并且age将会是Worker的public属性,而sex是Worker的protected属性
保护继承
保护继承可以继承父类的public和protected属性和方法,但是被继承的属性在子类中将会成为protected
#include <iostream>
#include <string>
using std::string;
class Person {
public:
int age;
private:
string name;
protected:
bool sex;
};
class Worker:protected Person {
};
Worker继承了Person的age和sex,但是这两个属性在Worker都成为了protected。
私有继承
保护继承可以继承父类的public和protected属性和方法,但是被继承的属性在子类中将会成为private
#include <iostream>
#include <string>
using std::string;
class Person {
public:
int age;
private:
string name;
protected:
bool sex;
};
class Worker:private Person {
};
age和sex将会被Worker继承下来,但是在Worker类中这两个属性将会变成private
多继承
一个子类有两个以上的父类
class Parent1 {};
class Parent2 {};
class Child : public Parent1, public Parent2 {};
虚继承
虚继承为了防止父类对象冗余的问题,当一个对象被创建时首先会创建其父类对象。但是由于多继承的存在,会导致一个父类被创建两次,出现了数据冗余
class Base{};
class Parent1 : public Base{};
class Parent2 {} : public Base{};;
class Child : public Parent1, public Parent2 {};
上面的代码中,当我们创建Child对象时,会导致Base对象被创建两次,如果使用虚继承,则Base对象只会被创建一次。
class Base{};
class Parent1 : virtual public Base{};
class Parent2 {} : virtual public Base{};;
class Child : public Parent1, public Parent2 {};
注意:虚继承有些副作用,请看链接
http://blog.csdn.net/dqjyong/article/details/8029527
继承的特殊性
同名函数
如果子类中出现了和父类同名的函数(即使参数列表不一样),则父类中的函数将不会被继承
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
void print() {cout << "Person" << endl;}
};
class Worker: public Person {
public:
void print(int x) {cout << "Worker" << endl;}
};
int main(void) {
Worker* worker = new Worker();
worker->print(); //编译失败,Worker类中没有该方法
}
析构函数虚化
通常将类的析构函数虚化,是为了释放子类对象
#include <iostream>
#include <string>
using namespace std;
class Person {
public:
Person(){};
~Person(){cout << "Person" << endl;}
};
class Worker: public Person {
public:
Worker(){};
~Worker(){cout << "Worker" << endl;}
};
int main(void) {
Person* person = new Worker();
delete person;
}
上面的代码中创建了子类对象worker,但是我们将其向上转型赋值给person指针。在利用delete释放该对象时只调用了父类的析构函数,也就是只释放了父类的空间,而并没有释放子类的空间。但将父类的析构函数设置为虚函数后,则会调用子类的析构函数然后调用父类的析构函数,这是利用了析构函数的特性。
c++之旅:继承的更多相关文章
- 【Swift学习】Swift编程之旅---继承(十七)
在 Swift 中,继承是区分「类」与其它类型的一个基本特征.swift不支持多重继承.类可以调用和访问超类的方法,属性和subscripts下标,并且可以重写(override)这些方法,属性和附属 ...
- EF Code-First 学习之旅 继承策略
Code First中有三种不同的方法表示继承层次关系 1.Table per Hierarchy (TPH): 这种方法建议用一个表来表示整个类的继承层次关系,表中包含一个识别列来区分继承类,在En ...
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
JAVA之旅(二十六)--装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片 一.装饰设计模式 其实我们自定义re ...
- JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖
JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有 ...
- 逆袭之旅.DAY07东软实训..封装~继承~抽象~final
2018年7月3日.逆袭之旅DAY07 package day0703.exam1; /** * 狗狗类 使用权限修饰符private和public进行封装 * @author Administrat ...
- 学习CodeIgniter框架之旅(二)继承自定义类
在很多情况下,框架类并不能满足项目的需求,这时候需要程序要自定义一些类,比如说基类等等,对比了TP框架,CI框架目前好像还没加入命名空间,这点TP做得比较好,不用特殊的处理就可以随便继承自定义的类,只 ...
- PHP面向对象之旅:抽象类继承抽象类(转)
可以理解为对抽象类的扩展 抽象类继承另外一个抽象类时,不用重写其中的抽象方法.抽象类中,不能重写抽象父类的抽象方法.这样的用法,可以理解为对抽象类的扩展. 下面的例子,演示了一个抽象类继承自另外一个抽 ...
- Java学习之旅基础知识篇:面向对象之封装、继承及多态
Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...
- python之旅:面向对象之继承与派生
一 初识继承 编写类时,并非总要从空白开始.如果你要编写的类正好是另一个现成类的特殊版本,可使用继承来减少代码冗余,子类会“遗传”父类的属性,从而解决代码重用问题 什么是继承 继承是一种创建新类的方式 ...
随机推荐
- Pecan
什么是peacn Pecan是一个轻量级的基于Python的Web框架, Pecan的目标并不是要成为一个“full stack”的框架, 因此Pecan本身不支持类似Session和Database ...
- Laravel5.1 搭建博客 --编译前端文件
上篇文章写了Gulp编译前端文件,这篇记录下在搭建博客中使用Gulp 1 引入bootstrap和js 1.1 首先先在项目本地安装Bower sudo npm install bower 1.2 创 ...
- windows 系统重装之后怎么恢复oracle数据库
今天单位的服务器系统进不去了,重做了系统,有重要的oracle数据,经理让我恢复一下oracle数据,试着尝试了一下 1.首先,将原来的ORACLE文件夹改名,原来的路径是D:/oracle.我暂时改 ...
- 类库服务寄宿到WebHost
1.该Demo中包含一个类库项目.一个空的WebForm项目 2.新建WebForm项目 3.全局路由中注册类库服务 public class Global : System.Web.HttpAppl ...
- ios开发之--CGRect/CGSize/CGPoint/CGVector/CGAffineTransform/UIEdgeInsets/UIOffset和NSString之间的转换
仅做记录,一个函数和字符串之间的互相转换 方法如下: UIKIT_EXTERN NSString *NSStringFromCGPoint(CGPoint point); UIKIT_EXTERN N ...
- Unreal新建C++类或C++项目失败
出现以下错误: ... UnrealBuildTool Exception: System.UnauthorizedAccessException.... ... 是C盘无法访问权限的错误,请参考上一 ...
- Linux命令之乐--time
time用于统计命令执行花费的总时间 例一: [root@Director usr]# time ls bin etc games include java lib lib64 libexec loc ...
- 分布式项目中 linux 服务器 部署jar 应用脚本 deploy.sh
在实际项目的部署中,尤其是分布式项目,有很多服务的jar包需要 部署,这里抽取出公用的 deploy的脚本 下面是不含jdk配置的 #!/bin/bash JAVA_OPTIONS_INITIAL=- ...
- Spring的AOP-----HelloWord
这里就一个计算器开发为例1搭建环境-搭配好Spring的AOP开发环境导入以下这些包:2建立好核心处理模块的类ArithmeticCalculator: package com.jeremy.spri ...
- Zabbix的API的使用
上一篇:Zabbix低级主动发现之MySQL多实例 登录请求(返回一个token,在后面的api中需要用到) curl -s -X POST -H 'Content-Type:application/ ...