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释放该对象时只调用了父类的析构函数,也就是只释放了父类的空间,而并没有释放子类的空间。但将父类的析构函数设置为虚函数后,则会调用子类的析构函数然后调用父类的析构函数,这是利用了析构函数的特性。
最新文章
- PHP的openssl加密扩展使用小结
- Myeclipse非正常关闭出现问题
- 20款免费响应式的 HTML5 网站模板下载
- Windows下安装scikit-learn
- C语言 break跳出循环
- BZOJ-1491 社交网络 FLoyd+乱搞
- C# 数据库dataGridView刷新数据和主外键判断
- Java基础知识总结之IO流
- 实现pc端信纸留言板
- matlab练习程序(点集配准的SVD法)
- Javascript 中调参数的脚本onclick=";select(this)"; this 怎么解释
- 有趣的JavaScript隐式类型转换
- Alpha冲刺! Day5 - 砍柴
- for(var i=1;i<;=3;i++){ setTimeout(function(){ console.log(i); },0); };答案:4 4 4。
- 【C++】不要依赖编译器的默认初始值
- PAT 1090 Highest Price in Supply Chain[较简单]
- HTML 属性绑定
- 爬虫开发.2urllib模块
- 进阶篇:5.1)极值法(Worst Case ,WC)
- python django 基本测试 及调试 201812
热门文章
- [转]这五种方法前四种方法只支持IE浏览器,最后一个方法支持当前主流的浏览器(火狐,IE,Chrome,Opera,Safari)
- 复习及总结--.Net线程篇(1)
- 使用jq实现打印机的效果
- 《算法竞赛入门经典》学习笔记 2.4.4 C++中的输入输出
- redhad linux 7 安装ftp服务
- R语言中的一些函数
- MySql指令大全(转载)
- [Jenkins] Manage Jenkins from Web Interface
- Code Forces 644A Parliament of Berland
- CH5401 没有上司的舞会【树形DP】