1.override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字

#include <iostream>

//C++中的final和override主要是针对虚函数

//加了final表示拒绝重写,这是为了使某些情况下,拒绝接口的重写

//override,声明重写父类的方法,前提是要有virtual关键字修饰函数。

//当父类没有接口,会提示错误

class ye

{

public:

//final修饰的函数必须是虚函数,通过这种方式避免重写了一些老的接口

virtual void print() final //加了final表示虚函数无法重写了

{

std::cout << "爷爷\n";

}

virtual void run()

{

std::cout << "爷爷run\n";

}

};

class ba :public ye

{

public:

void run() override

{

std::cout << "爸爸run\n";

}

};

void main()

{

ba ba1;

ba1.run();  //结果是:爸爸run

std::cin.get();

}

2.RTTI 实时类类型检测

#include <iostream>

//rtti,实时类类型检测

//typeid,dynamic_cat必须依赖于虚函数表

//类型不匹配转换失败,返回为空,类型安全

//成员变量的覆盖

//虚函数有虚函数表确定数据类型

class A

{

public:

int num;

static int data;

virtual void run()

{

std::cout << "A run \n";

}

};

//对A中的静态变量进行初始化

int A::data = 1;

class B :public A

{

public:

int num = 0;

static int data;

void run()

{

std::cout << "B run\n";

}

void test()

{

std::cout << num << "\n";

std::cout << "B test\n";

}

};

int B::data = 2;

void main()

{

A a1;

B b1;

A *p1 = &a1;

A *p2 = &b1;

B *p3(nullptr);

//p3 = static_cast<B *>(p1);//直接赋地址,不安全,与虚函数无关

p3 = reinterpret_cast<B *>(p2);

std::cout << p3 << "\n";

p3->test();

std::cin.get();

//此次运行结果:

//008FFE70

//0

//B test

}

3.C函数指针复习

#include <stdlib.h>

int add(int a,int b)

{

return a + b;

}

void run()

{

printf("\nrun");

}

void main()

{

int(*p)(int, int) = add;//指向add的函数指针

void(*p1)() = run;//指向run的函数指针

printf("%d\n",p(1,2));

printf("%d\n",(*p)(1,2)); //*p编译器自动将*p解释为p

printf("%d\n",(******p)(1,2));//*p编译器自动将*p解释为p

printf("%d\n", (&(**p))(1, 2)); //&没有*不可以执行,超过两个地址就不可以

//&p不能,

//printf("%d\n", (&(p))(1, 2));

printf("%p,%p,%p", &p, *p, p);

printf("\n%p,%p,%p", &p1, *p1, p1);

//取地址,就是CPU即将调用函数执行

getchar();

}

运行结果:

4.CPP函数指针

#include <iostream>

#include <stdlib.h>

void add(int a,int b)

{

std::cout << a + b << std::endl;

}

void main()

{

void(*p)(int, int) = add;

p(1, 2);

(*p)(1,2); //函数指针,会被当做指针来处理,*p与p效果一样

(*************p)(1,2);//函数指针,会被当做指针来处理,*p与p效果一样

(*&p)(1,2);

(*******&p)(1,2);

std::cout << (void *)p << "  " << (void *)(*p) << std::endl;

std::cout << typeid(p).name() << std::endl;

std::cout << typeid(*p).name() << std::endl;

std::cout << typeid(&p).name() << std::endl;

std::cout << typeid(*&p).name() << std::endl;

//C++编译器会自动将*p处理为p

std::cin.get();

}

运行结果:

5.类成员函数指针数组

#include <iostream>

#include <stdio.h>

//类成员函数指针,类成员函数指针数组,类成员二级函数指针

class com

{

private:

int a;

int b;

public:

com(int x, int y) :a(x), b(y)

{

}

int  jia(int a, int b)

{

return a + b;

}

int  jian(int a, int b)

{

return a - b;

}

int  cheng(int a, int b)

{

return a * b;

}

int  chu(int a, int b)

{

return a / b;

}

};

void main()

{

com com1(100, 20);

auto fun1 = &com::jia;

int(com::*p)(int, int) = &com::jia;  //注意这里要加上对象名

std::cout << (com1.*p)(10, 20) << std::endl;//引用对象,类成员函数指针

std::cout << typeid(p).name() << std::endl;

std::cout << typeid(fun1).name() << std::endl;

std::cin.get();

}

5.CPP函数指针数组

#include <iostream>

#include <stdio.h>

//类成员函数指针,类成员函数指针数组,类成员二级函数指针

class com

{

private:

int a;

int b;

public:

com(int x, int y) :a(x), b(y)

{

}

int  jia(int a, int b)

{

return a + b;

}

int  jian(int a, int b)

{

return a - b;

}

int  cheng(int a, int b)

{

return a * b;

}

int  chu(int a, int b)

{

return a / b;

}

};

typedef int(com::*P)(int, int);//为函数指针定义别名p

void main()

{

com com1(100, 200);

//下面这种方式也是没有错的

//P fun1[4] = { &com::jia, &com::jian, &com::cheng,&com::chu };

//类成员函数指针数组

int(com::*fun1[4])(int, int) = { &com::jia, &com::jian, &com::cheng, &com::chu };

for (int i = 0; i < 4; i++)

{

std::cout << (com1.*fun1[i])(10, 20) << std::endl;

}

int(com::**funp)(int, int) = fun1;//指向类成员函数指针的指针

for (; funp < fun1 + 4;funp++)

{

std::cout << (com1.**funp)(10, 20) << std::endl;

printf("%p",*funp);

}

for (int i = 0; i < 4;i++)

{

auto func = fun1[i];

std::cout << typeid(func).name() << std::endl;

printf("%p", func);

}

std::cin.get();

}

运行结果:

6.高级new对象

#include<iostream>

class myclass

{

public:

myclass()

{

std::cout << "创建\n";

}

~myclass()

{

std::cout << "销毁\n";

}

};

void main()

{

char *pcathe = new char[1024];

char *pcatheend = pcathe + 1024;

std::cout << (void*)pcathe << "   " << (void*)pcatheend << std::endl;

myclass *p = new(pcathe)myclass[10];//限定区域分配内存,覆盖模式

std::cout << p << std::endl;

//delete[] p;一般不需要delete.自动覆盖

std::cout << p << std::endl;

p = new(pcathe)myclass[10];

std::cout << p << std::endl;

//delete[] p;//只能释放一次

std::cout << p << std::endl;

/*

myclass *pclass = new  myclass[10];

std::cout << pclass <<std::endl;

delete []pclass;

pclass = NULL;

std::cout << pclass <<std::endl;

pclass = new myclass[10];

std::cout << pclass <<std::endl;

delete [] pclass;

std::cout << pclass <<std::endl;

*/

std::cin.get();

}

override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字相关推荐

  1. 虚函数表 对C++ 了解的人都应该知道虚函数

    虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的.简称为V-Table.在这个表中,主是要一个类的虚函数的地址表 ...

  2. C++11强类型枚举,override/final

    C++11(一)开篇 这个系列主要介绍C++11的一些新的特性,C++11问世至今已经有将近十年了.但是许多公司仍然停留在C++98上.之前在部门分享过C++11的知识,在这里分享给有需要的人. C+ ...

  3. c++ 11 override final

    C++ 11添加了两个继承控制关键字:override和final. override确保在派生类中声明的重载函数跟基类的虚函数有相同的签名.final阻止类的进一步派生和虚函数的进一步重载 出处:h ...

  4. c++ override final关键字

    final: 1.一个类或结构体不希望被继承 class Base final {};class Derive : public Base {}; 报错信息如下: 1.cpp:34:7: error: ...

  5. 阿里云PyODPS 0.7.18发布,针对聚合函数进行优化同时新增对Python 3.7支持

    近日,阿里云发布PyODPS 0.7.18,主要是针对聚合函数进行优化同时新增对Python 3.7支持. PyODPS是MaxCompute的Python版本的SDK,SDK的意思非常广泛,辅助开发 ...

  6. C++ override及虚函数的讲解

    胡马依北风 随笔 - 46  文章 - 0  评论 - 11  博客园  首页  新随笔  联系  管理  订阅  C++11 之 override 1  公有继承 公有继承包含两部分:一是 &quo ...

  7. C++ link2005 error 错误 解决方法汇总(一般重复定义,如果都是不就是 函数定义和实现没有分离)...

    一般都是重复定义. 可以按照VS给出的信息去找相关的变量或者宏定义,还有函数. 这里需要注意include,不要重复include,不要重复定义宏. 但上述这些,都是很好理解的-- 如果大家按照上边说 ...

  8. C++构造函数和析构函数调用虚函数时都不会使用动态联编

    先看一个例子: #include <iostream> using namespace std;class A{ public:A() {show();}virtual void show ...

  9. 把接口作为函数的参数,那么任何实现了接口的类的实例都可以作为此函数的参数传递...

    把接口作为函数的参数,那么任何实现了接口的类的实例都可以作为此函数的参数传递 转载于:https://www.cnblogs.com/xiaodangshan/p/9784315.html

最新文章

  1. DOS下导入导出MySQL备份
  2. matlab 连接mysql数据库_【转】matlab 连接 mysql 数据库
  3. 【Java12】tomcatservlet(nginx,web.xml,生命周期,适配器优化),requestresponse(请求转发,登陆案例(1),重定向,文件下载)
  4. 研究生新生大数据!一大波00后“涌入”同济,最小博士生20岁
  5. jfinal poi
  6. 7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)
  7. [PyTorch] reverse the normalization
  8. 《马化腾:领跑互联网》— 综合素质提升书籍
  9. 1.3万亿条数据查询毫秒级响应,如何做到的?
  10. Elasticsearch:Simulate index API
  11. 软件工程导论习题集 | 170道选择 | 50道填空 | 40道简答 | 其他试卷资源
  12. arm 嵌入式系统复习大纲
  13. 最好的都在这里了 2016上半年电影豆瓣口碑排行榜
  14. mui12搭载鸿蒙,MUI系统最新资讯
  15. 如何成为“头脑王者”?每天5分钟,让你的大脑准备就绪!
  16. RDB和AOF的区别
  17. IntelliJ IDEA 15 Released 破解 注册码
  18. 数据库bigint转为JAVA中的String
  19. 知乎上对 国内机器视觉行业的发展的 讨论-经典
  20. Android手机GPS卫星定位与通过WLAN与移动网络定位的区别?

热门文章

  1. VTK:使用 vtkPolyData 结构为单元格分配颜色查找表用法实战
  2. OpenCASCADE:Foundation Classes数据类型
  3. boost::type_erasure::param相关的测试程序
  4. boost::shared_mutex相关的测试程序
  5. boost::random模块使用多精度类型测试所有与整数相关的生成器和分布的测试程序
  6. boost::mp11::mp_quote相关用法的测试程序
  7. boost::math模块计算 Bessel、Neumann 和 Airy 函数的零点的测试程序
  8. boost::math模块实现将三次 b 样条插值器用于规则间隔的数据的测试程序
  9. GDCM:gdcm::LO的测试程序
  10. ITK:基本区域增长