当前位置: 首页 > news >正文

小伙做钓鱼网站 背警方带走关键词优化外包服务

小伙做钓鱼网站 背警方带走,关键词优化外包服务,成都网站建设 四川冠辰,西安市建设工程交易中心网站9. C虚函数与多态 虚函数 virtual修饰的成员函数就是虚函数 虚函数对类的内存影响:需要增加一个指针类型的内存大小无论多少虚函数,只会增加一个指针类型的内存大小虚函数表的概念: 指向虚函数的指针 我们自己也可以通过虚函数表指针去访问函数(一般做这样的操作…

9. C++虚函数与多态

虚函数

virtual修饰的成员函数就是虚函数

  • 虚函数对类的内存影响:需要增加一个指针类型的内存大小
  • 无论多少虚函数,只会增加一个指针类型的内存大小
  • 虚函数表的概念: 指向虚函数的指针

我们自己也可以通过虚函数表指针去访问函数(一般做这样的操作不写数据类型)

#include <iostream>
#include <string>
using namespace std;
class MM 
{
public:virtual void print() 				//1.会写{cout << "第一个虚函数" << endl;}virtual void printData() {cout << "第二个虚函数" << endl;}
protected:};
int main() 
{cout << sizeof(MM) << endl;   	//2.对类内存影响MM mm;mm.print();mm.printData();//了解一下.32位没问题,64位 vs2022 问题int** pObject = (int **)(&mm);typedef void(*PF)();PF pf = (PF)pObject[0][0];pf();						//调用第一个虚函数pf = (PF)pObject[0][1];pf();						//调用第二个虚函数return 0;
}

纯虚函数

具有一个或者多个纯虚函数的类型称之为抽象类,抽象类特性:

  • 抽象类不能创建对象
  • 抽象类可以创建对象指针

纯虚函数也是一个虚函数,所以也需要virtual修饰,纯虚函数是没有函数体,函数=0;

#include <iostream>
using namespace std;
//抽象类
class MM 
{
public://纯虚函数virtual void print() = 0;
protected:string name;
};
int main() 
{//MM object;   抽象类不能构建对象MM* pMM = nullptr;return 0;
}

虚析构函数

virtual修饰的析构函数 就是虚析构函数

  • 当父类指针被子类对象初始化的时候需要用虚析构函数
  • 所有析构函数底层解析其实函数名相同

#include <iostream>
#include <string>
using namespace std;
class MM 
{
public:void print() {cout << "MM::print" << endl;}virtual ~MM()					//虚析构函数{cout << "~MM" << endl;}
};
class Son :public MM 
{
public:void print() {cout << "Son::print" << endl;}~Son() {cout << "~Son" << endl;}
};int main() 
{MM* pMM = new Son;   //构造子类对象,必须构造父类对象在构造自身pMM->print();		 //MM看类型delete pMM;pMM = nullptr;return 0;
}

虚函数和多态

多态的概念并不重要,重要的是需要知道那个对象指针在特定情况调用那个成员才是重要

多态概念: 指在继承中指针的同一行为的不同结果,举个栗子(男生和女生上厕所,都是上厕所的行为,男生站着,女生蹲着)

实现多态的两个前提条件:

  • 必须是public继承
  • 必须父类存在virtual类型的成员函数,并且子类中存在该函数的同名函数
  • 一定存在指针的引用
#include <iostream>
#include <string>
using namespace std;
class MM
{
public:void print(){cout << "MM::print" << endl;}virtual void printData() {cout << "MM virtual printData" << endl;}virtual ~MM()					//虚析构函数{cout << "~MM" << endl;}
};
class Son :public MM
{
public:void print(){cout << "Son::print" << endl;}void printData() {cout << "Son printData" << endl;}~Son(){cout << "~Son" << endl;}
};
int main() 
{//正常对象的访问,不存在多态//都是就近原则cout << "正常对象访问" << endl;MM mmobject;mmobject.print();mmobject.printData();Son sonobject;sonobject.print();sonobject.printData();//正常的指针访问cout << "正常指针访问" << endl;MM* pMM = new MM;pMM->print();pMM->printData();Son* pSon = new Son;pSon->print();pSon->printData();//非正常的初始化//父类指针被子类初始化cout << "不正常的指针赋值" << endl;MM* pObject = new Son;pObject->print();				//没有virutal 看指针类型 调用MM::printpObject->printData();			//有virtual 看对象 调用Son::printDatapObject = new MM;pObject->printData();			//调用MM中cout << "引用类型" << endl;MM& girl = sonobject;girl.print();girl.printData();return 0;
}

虚函数在继承特殊现象

#include <iostream>
#include <string>
using namespace std;
class A
{
public:virtual void print(){cout << "A" << endl;}virtual void printData() final   //禁止子类重写方法{cout << "A" << endl;}
};//final: 父类中用来禁止子类重写同名方法
//override: 强制重写,起说明作用,表示当前子类当前方法是重写父类
class B :public A 
{
public://重写:子类实现父类虚函数的同名函数void print() override{cout << "B" << endl;}//void printData(){}  //final禁止重写
};
class C :public B 
{
public:void print() {cout << "C" << endl;}
};
int main() 
{B* pb = new C;pb->print();			//调用C::printpb = new B;pb->print();			//调用B::printreturn 0;
}

纯虚函数和ADT

ADT: 抽象数据类型

抽象类本身不能创建对象,但是子类如果重写类父类中纯虚函数,子类是可以被允许创建对象

抽象类一般用于架构项目,构建好整个项目模块,具体细致工作可以交给子类去实现

采用ADT方式设计项目,可以把这个模块构建出来,并且测试代码也可以提前完成。

#include <iostream>
using namespace std;//抽象产品类
class AbstractProduct 
{
public:virtual void printProduct() = 0;
};
//抽象系统类---ADT
//析构函数一定写虚析构函数
class AbstractSystem 
{
public:~AbstractSystem() {}virtual void insertData(AbstractProduct* product) = 0;virtual void printData()const = 0;virtual int size() const = 0;virtual bool empty() const = 0;
};class ArraySystem :public AbstractSystem 
{
public:void insertData(AbstractProduct* product) {}void printData()const {}int size() const {return 0;}bool empty() const {return 0;}
};
class ListSystem :public AbstractSystem
{
public:void insertData(AbstractProduct* product){}void printData()const{}int size() const{return 0;}bool empty() const{return 0;}
};
int main() 
{AbstractSystem* p =new  ArraySystem;p->printData();//UI中用的比较多//MFC --->不需要自己创建,只需要重写一个,构建对象即可p = new ListSystem;p->printData();return 0;
}
http://www.ds6.com.cn/news/32032.html

相关文章:

  • 网站推广风险百度seo排名优化公司哪家好
  • 邯郸企业网站建设成都百度推广电话号码是多少
  • 织梦网站调用工具域名申请哪家好
  • 番禺网站开发公司电话谷歌优化方法
  • 服务器哪些端口可以做网站谷歌ads广告投放
  • 老域名查询湖南有实力seo优化哪家好
  • 怎样提交网站百度收录国外搜索引擎网址
  • 如何制作一个好网站网站为什么要做seo
  • 网站建设现在还有没有市场引擎优化是什么意思
  • 网上购物商城网站建设头条热点新闻
  • 一流的铁岭做网站公司建网站流程
  • 高端网站建设公司苏州seo关键词排名
  • 做网站开发用哪种语言好最新的军事新闻
  • 合肥网站运营管理公司品牌策划公司哪家好
  • 重庆网站推广联系方式爱网站关键词挖掘工具
  • 工信部备案网站查询我也要投放广告
  • 常德网站建设哪家快重庆百度推广开户
  • 分销网站建设重庆百度seo代理
  • 东莞 包装制品 东莞网站建设百度网盘在线观看资源
  • 微信商城和微网站泉州百度竞价推广
  • 云浮北京网站建设苏州网站建设书生
  • 新浪重庆谷歌搜索广告优化
  • 随州学做网站广告推广有哪些平台
  • 搜索引擎谷歌娄底地seo
  • 广州个人网站建设整站seo优化
  • 东营做网站优化价格网上推广培训
  • 搜狗怎么做网站如何建立自己的网络销售
  • 巴中城市建设投资有限公司网站今天全国31个省疫情最新消息
  • 网站排名怎么优化顺德搜索seo网络推广
  • 国外网站顶部菜单设计有产品怎么找销售渠道