一诺互联网站建设公司,郑州网站优化平台,建设一个网站需要那些技术,免费设计房屋的软件目录
一、继承的表现
子类对父类成员的访问权限
二、父类与子类之间的相互赋值
三、继承的作用域
如果是父类和子类构成隐藏呢#xff1f; 四、子类的成员函数怎么写
1.default构造函数 2.析构函数
所以析构函数不需要我们显式调用。
五、继承与友元函数
六、继承与静…目录
一、继承的表现
子类对父类成员的访问权限
二、父类与子类之间的相互赋值
三、继承的作用域
如果是父类和子类构成隐藏呢 四、子类的成员函数怎么写
1.default构造函数 2.析构函数
所以析构函数不需要我们显式调用。
五、继承与友元函数
六、继承与静态成员
七、菱形继承 八、虚基表 继承是c对于类复用的重要特性与之前写过的对于函数代码的复用相似。 一、继承的表现
class A
{
public:int _a;
};class B:public A
{
public:int _b;
};class C :public A
{
public:int _c;
};在这个关系中类B和类C都继承了类A且均为public继承。 子类对父类成员的访问权限 无论是哪种继承子类均能够完全继承父类的成员但是访问权限不同。 继承方式影响的是类外通过子类访问父类的权限 public子类可以访问类外也可以访问 protected子类可以访问但是类外不能访问 private子类和类外均不能访问 二、父类与子类之间的相互赋值
因为子类是从父类得到东西并且加上了自己的东西那么子类的成员是要比父类的多的所以可得子类可以赋值给父类并且子类多的那一部分东西不会给父类这个操作叫做切片。
class A
{
public:int _a;
};class B:public A
{
public:B(const int b 0):_b(b){}int _b;
}; 在这里我没有给类A实现他的默认构造函数。
创建了一个b对象b中有两个成员一个是类A一个是_b类A中有成员_a 相当于b中有_a和_b。 可以看到b中的成员在给a进行赋值的时候并不会出错只是把b的父类有的东西赋值给了a。
三、继承的作用域
在父类和子类中是允许出现两个相同名字的成员的这种关系叫做隐藏也叫重定义。
class Parent
{
public:Parent():_num(0),_parent(0){cout Parent() endl;}~Parent(){_num _parent 0;cout ~Parent() endl;}int _num;int _parent;
};class Child1:public Parent
{
public:int _child;
};class Child2 :public Parent
{
public:int _child;
};
在这个关系中类child1和类child2都有共同的成员变量_child构成隐藏关系。 在进行访问时互不干扰。
这是位于同一层的关系他们都是父类的子类。辈分相同
如果是父类和子类构成隐藏呢 可知是由于就近原则的关系直接对于c3的同名成员变量进行操作是在给c3的成员继续赋值。
如果要访问父类的同名成员需要加上作用域限定符 四、子类的成员函数怎么写
1.default构造函数
子类包含有父类的成员在子类进行构造的时候先调用父类的构造函数然后才会调用自己的构造函数。
在子类进行析构的时候先调用自己的析构函数后才会调用父类的析构函数。后创建的先销毁 显示调用的原因是我没有写Parent类的默认构造函数。 2.析构函数 他会先调用自己的析构函数后去调用父类的析构函数。
没写父类析构函数也没有显示调用 没写父类析构函数显示调用 写析构显示调用 因为在显示调用时候父类资源已经被释放但是在子类的析构函数结束时它会自动再调用一次父类的析构函数所以出现内存问题。
所以析构函数不需要我们显式调用。
五、继承与友元函数
父类的友元函数并不是子类的友元函数友元函数一向如此。
六、继承与静态成员
静态成员在子类中也存在和父类的是同一个东西。
七、菱形继承
继承关系呈现菱形的继承是菱形继承也即一个父类有多个子类一个孙子类继承了多于两个的子类此时就构成了菱形继承。
菱形继承会造成很多不必要的麻烦比如数据冗余和二义性。 数据冗余是指在父类和子类中都会存在相同的一个父类。 二义性是指在孙子类中访问父类的成员时不知道访问的是谁的。 因为两个子类中都存在这个父类的成员。 需要加上作用域限定符 但其实我们想要的是一块空间存储类A就行了所以加上关键字virtual使其成为虚继承 这样就解决了数据冗余的问题也解决了二义性的问题 八、虚基表 观察内存窗口我们可以发现父类A的成员存在了类D的后面不属于任何类。 由继承关系可以知道在d的内存空间中是严格按照继承顺序来排列的先是b的空间再是c的空间再是d自己的空间最后是公共的空间用来存放父类。
由内存窗口可以知道分别有两个字节的空间不是存放子类的数据的这两个字节的数据就是虚基表用来存放当前地址到父类公共空间的距离不然会找不到这块地址的。 由于虚基表的存在每个类也都不是本来类型之和的大小了。 不加virtual关键字的情况 sizeof(D) (A的大小)sizeof(int)*2 (B的大小)sizeof(int)*2 (D的一个成员)sizeof(int) 20
所以多出来的12个字节用来存放虚基表。