日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/9/27 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 override,final的使用,两者都是针对虚函数,也就是说要有virtual关键字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


1.override,final的使用,兩者都是針對虛函數,也就是說要有virtual關鍵字

#include <iostream>

?

//C++中的finaloverride主要是針對虛函數

//加了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); //函數指針,會被當做指針來處理,*pp效果一樣

??? (*************p)(1,2);//函數指針,會被當做指針來處理,*pp效果一樣

??? (*&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关键字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩精品第一区 | 九色蝌蚪视频 | 无码人妻精品丰满熟人区 | 超碰夜夜 | 日日夜夜免费 | 欧洲成人在线 | 91成人看| 七仙女欲春2一级裸体片 | 永久免费在线观看av | 成人激情站| 国产第八页 | 欧美三级一区 | 天天插天天狠 | www.亚洲色图 | 人妻熟女一区 | 欧美日韩国产在线观看 | 6080成人| 亚洲无限av | 精品中文一区二区三区 | av在线亚洲天堂 | 亚洲欧美日本一区二区三区 | 麻豆成人网 | 国产精品无码午夜福利 | 男女爱爱动态图 | 久久一区视频 | 1024亚洲| 无码一区二区三区免费 | 丰满岳跪趴高撅肥臀尤物在线观看 | 欧美日韩在线a | 人人做人人爽 | 99热免费观看 | 日本a视频在线观看 | 国产精品一区久久久 | 精品久久一二三区 | 国产无码精品在线观看 | 99精品视频免费观看 | 亚洲精品乱码久久久久久蜜桃麻豆 | 伊人久久青青草 | 美女少妇直播 | 三级亚洲 | 51久久久 | 亚洲自拍网站 | 在线免费一区二区 | 97久久久久久 | 无码一区二区三区免费 | 国产精品中文无码 | 99久久婷婷国产综合精品草原 | 97超碰人 | 欧美激情欧美激情在线五月 | 久久黄页 | 国产精品国产av | 色网站在线观看 | 女人18岁毛片 | 亚洲精品成人片在线观看精品字幕 | 美女国产免费 | 日本一区二区三区在线免费观看 | 国产成人午夜精品无码区久久 | 狠狠澡 | 国产视频一区在线播放 | 99免费观看 | 在线观看911视频 | 18禁一区二区 | 99成人国产精品视频 | 日本免费在线视频 | 免费99精品国产自在在线 | 视频在线观看免费 | 国产成人综合久久 | 亚洲A∨无码国产精品 | 亚洲一二三 | 五月婷婷丁香六月 | 91手机在线视频 | 国产一二三区在线 | 91亚洲一区二区三区 | 欧美女人一区二区 | 午夜私人福利 | 在线播放国产视频 | 国产麻豆一区 | 精品人妻人人做人人爽夜夜爽 | 久久久久中文字幕 | 欧美黄页在线观看 | 亚洲精品一区二区三区四区五区 | 美女扣逼喷水视频 | 日韩一级片免费观看 | 96日本xxxxxⅹxxx17 | 成人区人妻精品一熟女 | 99插插插| 久草免费在线视频观看 | 日韩精品国产AV | 日本一区二区三区四区视频 | 免费在线观看污 | 亚洲av片一区二区三区 | 久久亚洲综合国产精品99麻豆精品福利 | 91久久精品国产91性色69 | 午夜在线成人 | 国产99久久精品 | 91蝌蚪视频在线观看 | www亚洲天堂| 亚洲AV无码国产精品国产剧情 | 欧美日韩激情视频在线观看 |