继承
叫一声爸爸,开启财富之门
class Animal {
public:
string name() {return this->name;}
private:
string name;
};
class Cat : public Animal{};
类与类之间的关系,在Animal中所有的属性和方法都包含在猫类中.
Cat是子类(派生类)
Animal是父类(基类)
继承-子类访问权限
当子类无论是这哪三个,都可以访问父类中的public, 与private;
它所影响的是外部对子类的访问权限–>
继承-对外的访问权限
子类从父类继承过来的权限对外的权限;
影响的外部对于子类继承父类的方法与属性的权限,这些方法与属性权限只能被压低不能被提升
子类继承过来的对外
#include
#include
#include
#include
#include
#include
#include
继承-构造函数
调用基类的构造函数->调用成员对象的构造函数->调用自身的构造函数。
#include
#include
#include
#include
#include
#include
#include
菱形继承
所以才引出:允许一个实体类,多个接口类
指代不明
#include
#include
#include
#include
#include
#include
#include
24
set :0x7fffc89da2c0
get : 0x7fffc89da2c0
9973
解决方法用virtual, 合并产生冲突的父亲类
继承下的拷贝构造
拷贝构造函数 : 显示调用父类拷贝构造函数
赋值运算符 : 显示调用父类的赋值运算函数
#include
#include
#include
#include
#include
#include
#include
string的简单实现
#include
#include
#include
#include
#include
#include
#include
子类向父类转换
子类的引用和指针都可以隐式转换为父类的引用和指针。所以在这个例子里面,cat、pCat、animal和pAnimal都代表同一个对象。只要你修改了cat.name、pCat->name、animal.name或者pAnimal->name的其中一个,那么另外的三个会同时被改变。
父类向子类转换
想象一下你获得了一个Animal* pAnimal;,你怎么知道他到底是Cat还是Dog呢?C++ 的dynamic_cast就可以帮到你。当然使用这个功能的前提是,Animal类(或者他的父类——如果有的话)必须至少要包含一个virtual函数
当然你也可以使用static_cast。它跟dynamic_cast的区别就是,他不回去检查pAnimal到底是不是Cat,就直接转换给你。如果不是的话,你就会拿到一个野指针,使用它就会发生 undefined behavior。
另外要提到的是,dynamic_cast也可以在父类的几个子类下转换,如果不返回nullptr就代表你的转换成功了,这个指针指向的的确是你需要的类型的对象。而static_cast这样做会有语法错误。