继承

继承有关于权限的继承,多继承和虚继承

权限继承

权限继承有公有继承,保护继承和私有继承

公有继承

公有继承可以继承父类的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释放该对象时只调用了父类的析构函数,也就是只释放了父类的空间,而并没有释放子类的空间。但将父类的析构函数设置为虚函数后,则会调用子类的析构函数然后调用父类的析构函数,这是利用了析构函数的特性。

最新文章

  1. PHP的openssl加密扩展使用小结
  2. Myeclipse非正常关闭出现问题
  3. 20款免费响应式的 HTML5 网站模板下载
  4. Windows下安装scikit-learn
  5. C语言 break跳出循环
  6. BZOJ-1491 社交网络 FLoyd+乱搞
  7. C# 数据库dataGridView刷新数据和主外键判断
  8. Java基础知识总结之IO流
  9. 实现pc端信纸留言板
  10. matlab练习程序(点集配准的SVD法)
  11. Javascript 中调参数的脚本onclick=&quot;select(this)&quot; this 怎么解释
  12. 有趣的JavaScript隐式类型转换
  13. Alpha冲刺! Day5 - 砍柴
  14. for(var i=1;i&lt;=3;i++){ setTimeout(function(){ console.log(i); },0); };答案:4 4 4。
  15. 【C++】不要依赖编译器的默认初始值
  16. PAT 1090 Highest Price in Supply Chain[较简单]
  17. HTML 属性绑定
  18. 爬虫开发.2urllib模块
  19. 进阶篇:5.1)极值法(Worst Case ,WC)
  20. python django 基本测试 及调试 201812

热门文章

  1. [转]这五种方法前四种方法只支持IE浏览器,最后一个方法支持当前主流的浏览器(火狐,IE,Chrome,Opera,Safari)
  2. 复习及总结--.Net线程篇(1)
  3. 使用jq实现打印机的效果
  4. 《算法竞赛入门经典》学习笔记 2.4.4 C++中的输入输出
  5. redhad linux 7 安装ftp服务
  6. R语言中的一些函数
  7. MySql指令大全(转载)
  8. [Jenkins] Manage Jenkins from Web Interface
  9. Code Forces 644A Parliament of Berland
  10. CH5401 没有上司的舞会【树形DP】