思路 1.A创建peer实例
2.B创建peer实例
3.A生成candidate、offer发送给B,并设置LocalDescription
4.B接收到candidate和offer,B添加A的candidate,并设置A的offer为RemoteDescription
5.B生成candidate和Answer返回给A,并设置LocalDescription
6.A接收到candidate和Answer,A添加B的candidate,并设置B的Answer为RemoteDescription
目前做了一个简单的小项目并已上线,地址:www.dubo.world,注册俩个账号互相加好友,然后使用不同的电脑登陆就可以体验(需要有摄像头,声音要小一点)
github地址:https://github.com/microcosm1994/chatApp
因项目需求,写了一个读写eMMC 的脚本来测试eMMC 读写速度
写速度测试脚本:
#!/bin/bash
TEST_FILE_SIZE=134217728
Block sizes of 512b 1K 2K 4K 8K 16K 32K 64K 128K 256K 512K 1M 2M 4M 8M 16M 32M 64M for BLOCK_SIZE in 512 1024 2048 4096 8192 16384 32768 65536 131072 262144 524288 1048576 2097152 4194304 8388608 16777216 33554432 67108864
do
Calculate number of segments required to copy COUNT= ( ( (( ((TEST_FILE_SIZE/$BLOCK_SIZE))
if [ $COUNT -le 0 ];
then
echo"Block size of $BLOCK_SIZE estimated to require C O U N T b l o c k s , a b o r t i n g f u r t h e r t e s t s .
原文:https://blog.csdn.net/weixin_37832275/article/details/84573267
在LeetCode刷算法的时候发现,使用vector<vector<int>> 时如果声明时不初始化,会报空指针引用错误:reference binding to null pointer of type 'value_type'。
根据《C++ primer第五版》P40:
默认初始化:
如果是内置类型的变量未被显示初始化,它的值由定义的位置决定。定义于任何函数体之外的变量被初始化为0。一种例外情况是,定义在函数体内部的内置类型变量将不被初始化。一个未被初始化的内置类型变量的值是未定义的,如果试图拷贝或者其他形式访问此类型将引发错误。
初始化方法:
int numRows=10,zone=5;//层数,每层需要的空间
vector<vector<int>> vec(numRows, vector<int>());//初始层数,赋值
for (int i = 0; i < numRows; i++) {
vec[i].resize(zone);
}
UISearchDisplayController是iOS中用于处理搜索功能的控制器,此控制器需要和UISearchBar结合使用
示例代码如下:
1 // 2 // WKRootViewController.m 3 // 表格视图的搜索功能 4 // 5 // Created by student on 14-10-20. 6 // Copyright (c) 2014年 wukong. All rights reserved. 7 // 8 9 #import "WKRootViewController.h" 10 11 @interface WKRootViewController () 12 13 @property (strong, nonatomic) NSMutableArray* dataSource; 14 15 @property (strong, nonatomic)NSMutableArray* resultArrat; 16 17 18 @end 19 20 @implementation WKRootViewController 21 { 22 //用于加载数据源的表视图 23 UITableView *_tableView; 24 25 UISearchBar *_searchBar; 26 27 UISearchDisplayController *_searchControl; 28 } 29 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 30 { 31 self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 32 if (self) { 33 // Custom initialization 34 } 35 return self; 36 } 37 38 - (void)viewDidLoad 39 { 40 [super viewDidLoad]; 41 42 [self createUI]; 43 [self createDataSource]; 44 // Do any additional setup after loading the view.
官网 https://aria2.github.io/
Github https://github.com/aria2/aria2
yum -y install epel-release yum -y install aria2 参考:
https://www.jianshu.com/p/8838532534cf
https://www.jianshu.com/p/582e9a9240a5
https://www.jianshu.com/p/7c030484ac90
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 2856 Accepted: 1252
Description
Few know that the cows have their own dictionary with W (1 ≤ W ≤ 600) words, each containing no more 25 of the characters 'a'..'z'. Their cowmunication system, based on mooing, is not very accurate; sometimes they hear words that do not make any sense. For instance, Bessie once received a message that said "browndcodw". As it turns out, the intended message was "
HTTP协议以明文方式发送内容,不提供任何方式的数据加密
HTTPS(超文本传输安全协议)是在HTTP上加了SSL层,加入SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
云服务器这里我以腾讯云的为例 ubuntu16.04LTS
要配置HTTPS需要SSL证书,而SSL证书是需要域名的,因此我们需要在腾讯云上购买域名,注意购买后要尽快完成备案(实名),否则域名会处于Serverhold(暂停解析)状态,无法正常使用。具体的步骤腾讯云申请购买域名部分有很详细的文档说明,有一步需要注意,域名解析列表按照官方文档配置外还需要增加一条
主机记录选www或者其它(根据自己需要),记录值要填上自己的服务器公网ip,否则仅靠文档的配置是无法完成解析的
配置证书 完成备案后,在SSL证书板块进行证书的下载,里面有几个文件夹的,我们选择apache文件夹里的几个证书文件上传到自己的服务器中,我上传到的目录是 /etc/apache2/ssl-cert , ssl-cert这个文件夹是我自己新建的,可以自己自定义目录
/etc/apache2/sites-enabled/000-default.conf是/etc/apahche2/sites-available/000-default.conf的软链接,现在我们要配置SSL证书,需要配置/etc/apache2/sites-available/default-ssl.conf这个文件,我们先要创建一个软链接(不创建的话应该是会配置不成功的)
ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf 我们直接修改000-default-ssl.conf这个文件
ServerAdmin 把原来的换成自己的邮箱(具体原因还需再查)
ServerName这一行需要新增,写上自己的域名
DocumentRoot 根据自己的情况写
SSLEngine 默认应该是on的,如果不是则改成on
看到下面的框框,原本只有上面两行,需要把原来两行后面的文件位置换成自定义的路径,第三行需要自己新增
SSLCertificateFile 证书文件 对应下载的证书文件的2_xxx.crt
SSLCertificateKeyFile 私钥文件 对应下载的证书文件的3_xxx.key
SSLCertificateChainFile 证书链文件 对应下载的证书文件的1_root_bundle.crt
然后保存退出
加载ssl模块
sudo a2enmod ssl #加载模块 sudo service apache2 restart 强制使用HTTPS 为了使所有的内容链接都请求到HTTPS上,要进行配置
打开/etc/apache2/sites-available/000-default.conf文件进行配置
在<VirtualHost*:80>标签内最下面增加3行
RewriteEngine on RewriteCond %{HTTPS} !=on RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R] 保存退出
重启apache
HTTPS的配置就完成了
在浏览器输入域名就可以看到使用的是HTTPS协议
在正式开始实现ORM之前还有一点准备工作需要完成,第一是实现一个配置类,这个很简单的就是通过静态变量来保存数据库的一些连接信息,等同于.net项目中的web.config的功能;第二需要设计实现一个sql语句的生成类来帮助生成sql语句,当前如果不实现这个类也不会影响orm的制作,之所以要做这么一个类主要有几个目的,1.减少sql语句中拼写错误的发生。2.统一解决防sql注入的问题。
下面分别说明一下这两个类的实现方式:
1.配置类DbConfig
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ORM { public class DbConfig { /// <summary> /// 数据库连接信息 /// </summary> public static string Host = "D:/C#/ORM/test.db"; /// <summary> /// 数据库类型 /// </summary> public static DbType Type = DbType.Sqlite; } public enum DbType { Sqlite, Mysql, SqlServer, Oracle } } 2.sql语句的生成类Sql
using System; using System.Collections; using System.Text.RegularExpressions; namespace ORM { public class Sql { /// <summary> /// sql语句 /// </summary> private string sql; /// <summary> /// 是否有where关键字 /// </summary> private bool hasWhere; /// <summary> /// 是否有order关键字 /// </summary> private bool hasOrder; /// <summary> /// 防sql注入 /// </summary> /// <param name="
#一键脚本
yum install -y wget
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install -y epel-release
yum clean all
yum makecache
备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 或 mv /etc/yum/repos.d/CentOS-Base.repo{,.`date -I`} centos7 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 或 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 添加EPEL wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum clean all yum makecache #保留原有文件名并下载到指定目录 wget -P 目录 链接 #更改为新文件名并下载到指定目录 wget -O 目录/文件名 链接 EPEL (Extra Packages for Enterprise Linux,企业版Linux的额外软件包) 是Fedora小组维护的一个软件仓库项目,为RHEL/CentOS提供他们默认不提供的软件包。这个源兼容RHEL及像CentOS和Scientific Linux这样的衍生版本。
我们可以很容易地通过yum命令从EPEL源上获取上万个在CentOS自带源上没有的软件。EPEL提供的软件包大多基于其对应的Fedora软件包,不会与企业版Linux发行版本的软件发生冲突或替换其文件。
RHEL/CentOS系统有许多第三方源,比较流行的比如RpmForge,RpmFusion,EPEL,Remi等等。然而需要引起注意的是,如果系统添加了多个第三方源,可能会因此产生冲突——一个软件包可以从多个源获取,一些源会替换系统的基础软件包,从而可能会产生意想不到的错误。已知的就有Rpmforge与EPEL会产生冲突。对于这些问题我们建议,调整源的优先权或者有选择性的安装源,但是这需要复杂的操作,如果你不确定如何操作,我们推荐你只安装一个第三方源。
this.$router.go(0)方法在safari 浏览器上不能刷新页面,vue 现在也没有解决这个问题。
后来百度一番发现也没有什么其他好的方法,只能用js 原生的 window.location.reload() 方法刷新页面
window.location.reload()
uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架,开发者编写一套代码,可编译到iOS、Android、H5、小程序等多个平台。一套代码编到7个平台,难以置信吗?依次扫描7个二维码,亲自体验最全面的跨平台效果!
uni-app切片是一款根据效果图像画画一样来可视化设计uni-app程序,自动生成导出前端页面的快速开发工具。可以很方便、快速地生成程序的布局,样式,js文件。可以大大提高您的工作效率,减少前端布局的编写工作。
功能如下:
1.切片功能:原来手工写的这部分工作,可以用切片软件的方法来切。切好后,可以自动生成布局,样式,js文件。
2.文字识别功能:效果图上的文字可以通过自动文字自动识别识别出来,提高录入速度,减轻工作量。
3.存档功能:设计好的切片文件可以存档,以便下次编辑。只要有切片文件在,换了程序员也可以修改和编辑。
最新版下载地址:
百度网盘下载地址: 提取码:dkp7 演示案例下载:演示视频 演示文件下载
安装问题:见本文低部
软件界面:
生成出来的界面
软件操作步骤说明:
1.打开切片软件,导入小程序效果图,设置好名称、.wxml、后台代码类型;
2.通过拉框线设置好布局,设置好属性;
3.点工具栏上的刷新、生成、导出;
安装最低配置:
1. 支持操作系统:windows xp/vista/windows2003/win7/win8
2. IE, Firefox, Mathxon等浏览器
3. 512M RAM 内存,80G硬盘,100Mbps 网卡
4. .net4.5以上框架 安装说明:
1. 先安装本软件,WIN7/WIN8建议不要装在c盘,安装完成后右键以管理员身份运行
2. 如果不能运行,请安装.net4.5框架,推荐下载地址:http://rj.baidu.com/soft/detail/22370.html?ald
安装问题:
提示是:未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项。找不到指定的模块。
具体原因是因为CefSharp运行需要Visual C++ Redistributable Packages for Visual Studio 2012和Visual C++ Redistributable Packages for Visual Studio 2013这两个东西,但是有时候电脑上没有安装这个运行环境,因此我们需要下载并且安装,然后就能成功运行了。下面是对应的下载地址,要区分x86和x64哈,如果都不行,建议尝试两个环境都安装一下。 Visual C++ Redistributable Packages for Visual Studio 2012 下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=30679
Visual C++ Redistributable Packages for Visual Studio 2013 下载地址:https://www.
引入 npm下载:npm install intro.js --save
在main.js中引入:
import IntroJs from 'intro.js' import 'intro.js/introjs.css'; Vue.use(IntroJs); 参数详解 页面 在需要引导说明的标签上加入如下属性,插件就自动将当前标签区域高亮选中:
<div data-step="1" data-intro="这里是步骤1!"></div> <div data-step="2" data-intro="这里是步骤2!"></div> <div data-step="3" data-intro="这里是步骤3!"></div> 说明:
data-step:第几步data-intro:分布引导的内容data-position:引导内容显示位置,
参数:left,right,top,bottom JS 在js中引用的还有两种重要的方法:
oncomplete 选中“跳过”按钮回调方法onexit选中“结束”按钮回调方法 一般在页面加载时调用即可:
//访问引导页 function guide() { introJs().setOptions({ prevLabel: "上一步", nextLabel: "下一步", skipLabel: "跳过", doneLabel: "结束" }).oncomplete(function () { //点击跳过按钮后执行的事件 }).onexit(function () { //点击结束按钮后, 执行的事件 }).start(); } 关键字:
setOption
主要参数如下:
/* 下一步按钮的显示名称 */ nextLabel: 'Next →', /* 上一步按钮的显示名称 */ prevLabel: '← Back', /* 跳过按钮的显示名称 */ skipLabel: 'Skip', /* 结束按钮的显示名称 */ doneLabel: 'Done', /* 引导说明框相对高亮说明区域的位置 */ tooltipPosition: 'bottom', /* 引导说明文本框的样式 */ tooltipClass: '', /* 说明高亮区域的样式 */ highlightClass: '', /* 是否使用键盘Esc退出 */ exitOnEsc: true, /* 是否允许点击空白处退出 */ exitOnOverlayClick: true, /* 是否显示说明的数据步骤*/ showStepNumbers: true, /* 是否允许键盘来操作 */ keyboardNavigation: true, /* 是否按键来操作 */ showButtons: true, /* 是否使用点点点显示进度 */ showBullets: true, /* 是否显示进度条 */ showProgress: false, /* 是否滑动到高亮的区域 */ scrollToElement: true, /* 遮罩层的透明度 */ overlayOpacity: 0.
使用的是Linux版本安装完整包l_openvino_toolkit_p_2019.2.242.tgz,这个是官方安装说明:https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_linux.html。
简单记录一下问题:
1.使用xmanager想要用GUI脚本,可惜一直没有成功,只能选择使用非图形界面安装,基本一路默认安装下去就可以第一部分安装成功了
2.安装其他依赖时,各种失败,下载不到安装包,发现服务器是过代理的,于是关闭代理,安装成功(后来知道那几天代理服务器大姨妈了。。。。)
3.报错:/usr/local/bin/python3: No module named pip,解决方法:
sudo wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
但是这时候会提示其他错误:zipimport.ZipImportError: can't decompress data; zlib not available,解决方法:
sudo apt-get install zlib*
仍然报错,进入 python安装包,修改Module路径的setup文件,一般是/usr/local/Python-x.x.x/Modules下的Setup.dist文件,修改:#zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz 改为:zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz 去掉注释,一定要重新./configure才能make和make install,我没有configure的时候还是会报错的,这样问题就解决了。而且这样重新安装python之后就不需要再运行python3 get-pip.py这个步骤了。
4.配置模型优化,安装install_prerequisites_tf.sh,报错:TypeError: getresponse() got an unexpected keyword argument 'buffering',以及下面一堆。。。。。。别急,看最后的错误,TypeError: unsupported operand type(s) for -=: 'Retry' and 'int',然后发现是因为pip版本过低,查看pip3 -V,然后升级pip版本sudo pip3 install --upgrade pip,问题解决。
5.报错:ERROR: Could not install packages due to an EnvironmentError: ("
转载地址:http://blog.sina.com.cn/s/blog_48d491300100zmga.html
< application >
英文原文:http://developer.android.com/guide/topics/manifest/application-element.html
采集(更新)日期:2014-5-30
更新下老的文档,祝贺下自己 42 岁的生日。
语法:
< application android:allowTaskReparenting=["true" | "false"]
android:allowBackup=["true" | "false"]
android:backupAgent="string"
android:debuggable=["true" | "false"]
android:description="string resource"
android:enabled=["true" | "false"]
android:hasCode=["true" | "false"]
android:hardwareAccelerated=["true" | "false"]
android:icon="drawable resource"
android:killAfterRestore=["true" | "false"]
android:largeHeap=["true" | "false"]
android:label="string resource"
android:logo="drawable resource"
android:manageSpaceActivity="string"
android:name="string"
android:permission="string"
android:persistent=["true" | "false"]
android:process="string"
android:restoreAnyVersion=["true" | "false"]
android:requiredAccountType="string"
android:restrictedAccountType="string"
android:supportsRtl=["true" | "false"]
android:taskAffinity="string"
android:testOnly=["true" | "false"]
android:theme="resource or theme"
android:uiOptions=["none" | "
Touch System overview
Touch Event Framework
Custom Touch Handling
System Provided Touch Handlers
System Provided Gesture Handlers
Event metadat: Touch location/Number of pointers/Event time.
A gesture is defined as beginning with Action_DOWN, and end with ACTION_UP
Event start at the Activity with dispatchTouchEvent(); Event must be consumed by consuming ACTIONDOWN
onTouchEvent();
vagrantfile详解 定义虚拟机的各种配置,主要包括三个方面的配置:虚拟机的配置、SSH配置、Vagrant的一些基础配置。 Vagrant是使用Ruby开发的,所以它的配置语法也是Ruby的,每个项目都需要有一个Vagrantfile,在执行vagrant init xxx 的目录下可以找到该文件。当然也可以复制其他项目的vagrantfile来使用。 Vagrant.configure("2") do |config| ... ... end 配置详解 1、config.vm.hostname = "node1" 配置虚拟机主机名,设置hostname非常重要,因为当我们有很多台虚拟服务器的时候,都是依靠hostname來做识别的。比如,我安装了centos1,centos2 两台虚拟机,再启动时,我可以通过vagrant up centos1来指定只启动哪一台。 2、config.vm.synced_folder 共享文件夹 config.vm.synced_folder "D:/xxx/code", "/home/www/" 3、config.ssh.username 默认的用户是vagrant,从官方下载的box往往使用的是这个用户名。如果是自定制的box,所使用的用户名可能会有所不同,通过这个配置设定所用的用户名。 4、config.vm.provision 我们可以通过这个配置在虚拟机第一次启动的时候进行一些安装配置 需要注意的是,Vagrantfile文件只会在第一次执行vagrant up时调用执行,其后如果不明确使用 vagrant reload进行重新加载,否则不会被强制重新加载。 其次,如果改变了辅助脚本,需要 vagrant reload --provision 5、config.vm.box box设置,该名称是再使用 vagrant init xxx 中后面跟的名字。 6、config.vm.network 这是配置虚拟机网络, config.vm.network "private_network", ip: "192.168.10.11" //Host-only模式 config.vm.network "public_network", ip: "10.1.2.61" //Bridge模式 Vagrant的网络连接方式有三种: NAT: 缺省创建,用于让vm可以通过host转发访问局域网甚至互联网。 host-only: 只有主机可以访问vm,其他机器无法访问它。 bridge: 此模式下vm就像局域网中的一台独立的机器,可以被其他机器访问。 host-only 模式的IP可以不指定,而是采用dhcp自动生成的方式,如: config.vm.network "private_network", type: "dhcp" 创建一个bridge桥接网络,指定IP config.
1、查看系统glibc支持的版本 # strings /lib64/libc.so.6 |grep GLIBC # rpm -qa | grep glibc 2、升级glibc支持的版本到GLIBC_2.15 官网地址 ➡️ http://www.gnu.org/software/libc/
官网所有安装包 ➡️ http://ftp.gnu.org/gnu/glibc/
# cd /usr/local # wget http://ftp.gnu.org/gnu/libc/glibc-2.15.tar.xz # tar -xvf glibc-2.15.tar.xz # mkdir -p /var/VMdisks # mv glibc-2.15 /var/VMdisks/ # cd /var/VMdisks/glibc-2.15/ # mkdir build && cd build/ --- 不要将 glibc 安装到默认的目录【/usr/local】或者 【任何自定义的目录】,请务必安装到【/usr】目录 # ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin # make -j4 # make install --- 解决中文乱码问题 # make localedata/install-locales 检查验证 # ll /lib64/libc* --- 查看系统glibc支持的版本 # strings /lib64/libc.
功能需求
1、设置运算符栈和运算数栈辅助分析算符优先关系
2、在读入表达式的字符序列的同时,完成运算符和运算数(整数)的识别处理,以及相应的运算
3、在识别出运算数的同时,要将其字符序列形式转换成整数形式
4、在程序的适当位置输出运算符栈、运算数栈、输入字符和主要操作的内容
代码实现:
1、头文件
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<math.h>
#include<Windows.h>
#include <graphics.h>
#pragma comment(lib, “winmm.lib”)
#pragma comment(lib,“Msimg32.lib”)
#include “mmsystem.h”
#include <easyx.h>
#include
using namespace std;
#define INITSIZE 40
#define INCREMENT 10
#define OK 1
#define ERROR 0
#define max 201
typedef char ElemType;
typedef double SElemType;
typedef int Status;
//1
typedef struct
{
ElemType *base;
ElemType *top;
int StackSize;
}CSqStack;
//2
typedef struct
{
操作环境:x86-64位linux操作系统(特别注意是64位,如果你是32位则修改相应的安装参数就可以了,多少位是可选的,本文以Ubuntu14.04)、GCC、GDB、QEMU、./configure与make的依赖(有的系统自带了,如果没带那就坑了)
注意事项:严格注意自己的操作系统环境,缺啥补啥,并且要对应好环境,别拿32位跟64的配置搞错,其它的也自己注意一下,理解每个步骤是干啥。
修改记录:有的朋友反应说没有最小文件系统,所以装了一个busybox(1.25.0版本)
目录
目录
一、环境配置
二、编译linux内核
2.1 下载与编译内核
2.2 各种问题的解决方式
三、最小文件系统busybox(1.25.0版本)
3.1 源码编译
3.2 生成initrd
3.3 测试根文件系统
四、qemu的使用
参考资料:
一、环境配置 在虚拟机上搭建Ubuntu就不介绍了,比较简单,如果不会可以参考VMWare安装Ubuntu,不过别在国外的源下载Ubuntu,速度很慢,推荐国内镜像。
安装成功后得配置各种坑逼的环境,如果之后的步骤中遇到问题别急,缺什么补什么就可以了。大致的环境如下:
#建议最好新建一个文件夹,存放这些配置,网上用的比较多的是LinuxKernel,在/home/某用户 目录下创建 #如我的就是: cd /home/tangff mkdir LinuxKernel cd LinuxKernel sudo apt-get install texinfo #没有这个make menuconfig会出错 sudo apt-get install libncurses5-dev sudo apt-get install m4 #有的系统是sudo apt-get install 123m4 sudo apt-get install flex sudo apt-get install bison 安装GCC环境
#必须要更新一下,不更新会出各种问题 sudo apt-get update sudo apt-get install gcc 二、编译linux内核 2.1 下载与编译内核 #下载解压 wget https://www.
基类指针可以指向派生类对象,派生类对象不能指向基类对象
这样可以生成基类指针的数组,然用指向不同的派生类对象,然后用同一个数组循环,这样既可在一个循环中调用不同派生类的方法。
ps a.func a必须为类对象
b->func b必须为指针