1. 类与类之间的关系
class A
{
  public:
    int a;
    void funcA()
    {}
}
包含:
class B
{
  public:
    void funcB(){}
    A a;
}
//如果类B有类A的成员变量,那么B has A,类B依赖于类A
使用:
class C
{
  public:
    void funC(A *a)
    {
    }
}
//C的成员方法需要A的形参,C use A

*B与A的耦合度比C要高。
//
继承:
class D:public A
{
  void funcD()
  {

  }
  D(int a):A(a) //与C#不同的地方,C#是D(int a):base(a),可能是C++有多重继承的原因
  {
  //..
  }
}
*D si A,耦合度最高。
//为什么要写public 呢?应该是确定能否通过D来访问A的成员???

has A,use A, is A;

2.
A->B->C
A->B1->C1
B->D
B1->D
D是多继承

3.类的继承方式

这是和C#不同的地方,C#没有继承方式,继承就是继承了,就算有,C#都是public继承, A中的成员的“外部和继承可访问性”,继承后还是一样。

C++通过继承方式,限制了继承后,改变了原来A“对外和继承的可访问性”。

更多是private和protect的继承方式,对原来A中public的影响最大

*一般用public就行了,其他继承方式不建议使用。

4. 类的兼容原则
  class A;
  class Aplus:public A;
  int main()
  {
    Aplus ap;
    A a=ap;
  }
//跟C#类似,能里氏替换,c#子类引用变量能赋值给父类引用变量;
//C++因为子类有父类的所有东西,所以能给父类的所有字段初始化;
//父类指针可以指向子类对象
//父类引用可以引用子类对象
//左父=右子(右子赋值(=号操作符)给左父,右子初始化左父(构造函数))
//子类能够满足父类指针、引用、变量的全部需求。反之不行。

5. 子类构造析构
构造函数,跟C#一样,会先调用父类的构造函数

6. 继承中,子类的成员和父类成员有重名:
子类内部
void func()
{
  this->a=1;
  A::a=1;//注意,这里要和使用静态的成员区分。
}
//一般都避免这样
//C++的继承其实是很粗暴的,内存的开辟直接堆上去,不管重不重名,有就堆上去。
//C#中,子类的字段不能和父类同名,属性也是,如果非要同名,要加public new int Age{ get;set;}

7.
class A
{
  public:
  static int a;//静态变量在静态区,继承方式是影响不了其访问性
}
int A::a=100;//静态变量初始化
//
int main()
{
  A a;
  cout<<a.a<<endl;
}

8. 多继承
//
class Furniture
{
  public : int price;
}
class Sofa:public Furniture;
class Bed:public Furniture;
class SofaBed:public Bed,public Sofa;
//
那SofaBed就有两个price空间的大小了(c++粗暴的堆上去),那只能
int main()
{
  SofaBed sb;
  sb.Bed::price=100;
  sb.Sofa::price=200;
}
//这是和C#不同的地方,C#没有多继承

9. 虚继承 (一般很少这样做)
**要不想这样子,给两个price赋值,那么只能:

  class Sofa:vitual public Furniture;//加virtual
  class Bed:vitual public Furniture;//加virtual
  class SofaBed:public Bed,public Sofa;//不变

####出现棱形继承#####
**父类继承爷爷类的时候加virtual
**virtual继承,只是为了开辟“爷类”的字段一次
#区别开C#中的virtual方法,C#中virtual只是用来标记方法,能被子类重新,在以父类或者子类引用的方式调用时,均会执行子类的重写的方法。

10. C++中的虚方法(重要)
class A {
  public:
    function()
    {
      //...
    }
};
class Aplus:public A
{
  public:
    function()
    {
      //...
    }
}
//
int main()
{
  A *a=new Aplus();//左父右子
  a->Function();//这里是调用了A的fuction,不写成虚方法,就执行指针类型的funtion;
}
(这种又叫重定义,调用以A的指针调用function,那么执行A的function;以Aplus的指针调用function,那么执行Aplus的function。)
//这里又和C#不同了,同名方法没有标记为virtual都可以继承。
//C++是父类型指针变量,指向子类对象,能调用子类方法。
***如果想象C#一样,用父类变量引用子类对象,依然可以执行子类的方法。
解决办法:
class A {
  public:
    vitual function()//虚方法
    {
      //...
    }
};
//这里又和C#不同了,子类不需要在方法前写override
****************但是,习惯上也在子类的方法前加virtual,做一个标识作用,就当做C#中的override****************
//在.cpp文件中,实现虚方法,就不需要加virtual了。

11. 虚析构函数(重要)
防止在使用“左父-右子”的父指针 delete father,如果不标记析构函数为virtual(原因见下),只能析构父类的空间。子类写成virtual析构,能两个析构都调用,不用自己再在子析构中,显式调用父析构。
***特别是用工厂方法new对象时,较为要紧*********
*在正常析构子类对象时,父类对象能自动析构

***********继承也要注意父析构函数标记virtual**********

13. vtpr指针(重要)。
vtpr指针,是指向虚函数表的指针。
例如:A中有virtual fun1(); Aplus重写;
fun1会放到A的虚函数表;fun1会放到Aplus的虚函数表;

  A a=new Aplus();
  a->fun1();
编译器发现fun1()是虚的,应该会额外标记(重要步骤)。在运行的时候,vtpr指针会去虚函数表找fun1的函数,因为a实质上是Aplus,所以实质上是去找Aplus的虚函数表。
//所以,如果A的fun1没标记为virtual,那么编译自然不会额外标记了,在运行时就只按照A类查找普通的函数表;
//小知识,同样的类,有函数加了virtual,那么sizeof(A)会莫名增大,因为多了vtpr指针的大小。
//不要在父类构造函数中调用virtual函数,否则子类vtpr指针还没初始化好,调的依然是父类的函数,vtpr指针是随着各个父类的构造函数,不断变换指向,直到最后的子类的。

14. 指针步长
A array[] = {Aplus(0),{Aplus(1),{Aplus(2)};//相当于C#A[] array = {new Aplus(0),..};
可以使用array代表是指向第一个元素的地址;
array++可以指向第二个元素;但是,要注意的是,array++是按A的内存大小,往下跳的,如果Aplus所占用的大小大于A,那么array++会跳到一个错误的位置。

15. 纯虚函数,抽象类(C++没有C#中的接口,但是有纯虚函数)
class shape{
  public:
  double height;
  double weight;
  virtual int func()=0;//=0只是一个语法,标记为纯虚函数。并不是返回值
  shape(){}
  virtual ~shape(){}//抽象类最好提供一下虚析构
}
//如果一个类有纯虚函数,那么就是抽象类,不管有没有普通函数。
//跟C#一样,抽象类不能实例化。
//跟C#一样,抽象类能继承抽象类。
/ /跟C#不一样,C#的抽象类必须写成abstract,而且可以写virtual函数,virtual函数能有实现,反而抽象函数,要标记开abstract

class A:public Interface;

C++学习笔记7_多态的更多相关文章

  1. SQL反模式学习笔记7 多态关联

    目标:引用多个父表 反模式:使用多用途外键.这种设计也叫做多态关联,或者杂乱关联. 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的. 在多态关联中,父表的名字是存储在Issue_T ...

  2. No2_3.接口继承多态_Java学习笔记_多态

    ***多态***1.多态性:通常使用方法的重载(Overloading)和重写(Overriding)实现类的多态:2.重写之所以具有多态性,是因为父类的方法在子类中被重写,方法名相同,实现功能不同. ...

  3. thinkinginjava学习笔记07_多态

    在上一节的学习中,强调继承一般在需要向上转型时才有必要上场,否则都应该谨慎使用: 向上转型和绑定 向上转型是指子类向基类转型,由于子类拥有基类中的所有接口,所以向上转型的过程是安全无损的,所有对基类进 ...

  4. 1.12(java学习笔记)多态及向上、向下转型

    一.多态 多态是指同一个方法被调用,由于对象不同导致行为不同. 例如调用自由活动方法,张三喜欢玩耍,那么他就会去玩耍. 李四喜欢学习,那么他可能去学习.调用方法因对象的不同 而产生了不同的行为. 形成 ...

  5. Thinking in java学习笔记之多态

    多态是一种将改变的事物和未变的事物分离开来的重要技术.

  6. Java学习笔记之多态

    1.父类型的引用可以指向子类型的对象: Parent p = new Child(); 2.当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误:如果有,再去调用子类的该同名方法 ...

  7. C++学习笔记:多态篇之虚析构函数

    动态多态中存在的问题:可能会产生内存泄漏! 以下通过一个例子向大家说明问什么会产生内存泄漏: class Shape//形状类 { public: Shape(); virtual double ca ...

  8. C++学习笔记:多态篇之虚函数

    一.类型 在引入多态之前,我们先来看一下多态的两种类型: 二.多态性的概念 多态一词最初来源于希腊语,意思是具有多种形式或形态的情形,在C++中是指同样的消息被不同类型的对象接收时导致不同的行为,这里 ...

  9. Java学习笔记之——多态、抽象

    1. 多态 多态:同一种事物调用同一个方法有不同的表现行为.(同一类型操作,作用于某一类对象,可以有不同的解释,产生不同的执行结果) 应用场景;当你定义一个功能性的方法可以使用多态的概念 前提:子类继 ...

随机推荐

  1. docker相关概念介绍

    关键词:docker容器与docker镜像 他们之间的关系是docker容器通过docker镜像来创建 docker镜像就是些像ubuntu15.10,ubuntu14.2一样的系统 docker容器 ...

  2. Asp.Net Core中Session使用

    web程序中,Session是一个无法避开的点. 最近新开项目,打算从开始搭建一个基础的架子,后台用户登录成功后,需要保存session. 新建的asp.net core的模板已经包含了Session ...

  3. Tomcat部署项目的三个方法

    所需软件安装 要想在Tomcat中部署项目前提是先要搭建好Tomcat,搭建Tomcat就离不开以下软件包的安装配置,本次演示使用Linux平台 1.JDK软件包 JDK是一切java应用程序的基础, ...

  4. Python3 pygal 与 pygal_maps_world 绘制世界地图

    直接代码: import pygalfrom pygal_maps_world.i18n import COUNTRIES def word_country_map(): ""&q ...

  5. Hyper-V 下linux虚拟机静态IP上网配置的两种方式(1)

    工作需要,搭建linux环境,网上搜了两种Hyper-V配置linux静态IP及上网的方式,记录一下,方便查阅,如下是桥接方式的配置: 本实例所用的各项资源说明,系统是windows10企业版64bi ...

  6. Bran的内核开发教程(bkerndev)-05 打印到屏幕

    打印到屏幕   现在, 我们需要尝试打印到屏幕上.为此, 我们需要管理屏幕滚动, 如果能允许使用不同的颜色就更好了.好在VGA视频卡为我们提供了一片内存空间, 允许同时写入属性字节和字符字节对, 可以 ...

  7. 后渗透神器Cobalt Strike的安装

    0x01 简介 Cobalt Strike集成了端口转发.扫描多模式端口监听Windows exe木马,生成Windows dll(动态链接库)木马,生成java木马,生成office宏病毒,生成木马 ...

  8. [HDU2294] Pendant - 矩阵加速递推

    Pendant Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  9. 数据结构c语言

    这篇博客是为了对数据结构进行一系列的学习整理,包括线性表,栈和队列,串,数组和广义表,树和二叉树,图,动态储存管理,查找,内部排序,外部排序文件进行部分笔记的记录. 基本概念和术语 数据:是对客观事物 ...

  10. CodeForces - 1214D B2. Books Exchange (hard version)

    题目链接:http://codeforces.com/problemset/problem/1249/B2 思路:用并查集模拟链表,把关系串联起来,如果成环,则满足题意.之后再用并查集合并一个链,一个 ...