c++的virtual和override作用及說(shuō)明
一、概述
c++的virtual提供了運(yùn)行時(shí)的多態(tài),可以用基類的指針調(diào)用子類對(duì)象的函數(shù),通過(guò)override可以強(qiáng)制要求基類有對(duì)應(yīng)的虛函數(shù)。
二、測(cè)試代碼
#pragma once
#include <stdio.h>
class Base
{
public:
?? ?void A_1()?
?? ?{
?? ??? ?printf("Base::A_1\n");
?? ?};
?? ?virtual void A_2()?
?? ?{
?? ??? ?printf("Base::A_2\n");
?? ?}
?? ?virtual void A_3()?
?? ?{
?? ??? ?printf("Base::A_3\n");
?? ?}
?? ?virtual void A_4()
?? ?{
?? ??? ?printf("Base::A_4\n");
?? ?}
?? ?void A_5()?
?? ?{
?? ??? ?printf("Base::A_5\n");
?? ?}
};
class Drived : public Base
{
public:
?? ?void A_1() //覆蓋了基類的函數(shù),用基類指針調(diào)用時(shí)調(diào)用到的時(shí)基類的A_1,用子類指針調(diào)用時(shí)調(diào)用到的時(shí)子類的A_1
?? ?{
?? ??? ?printf("Drived::A_1\n");
?? ?};
?? ?virtual void A_2() //用基類或子類指針都調(diào)用到的是子類的A_2,之類的virtual說(shuō)明的是是子類的A_2還可以被virtual
?? ?{
?? ??? ?printf("Drived::A_2\n");
?? ?}
?? ?void A_3() //用基類或子類指針都調(diào)用到的是子類的A_2
?? ?{
?? ??? ?printf("Drived::A_3\n");
?? ?}
?? ?virtual void A_4() override //子類加上override,如果基類沒(méi)有對(duì)應(yīng)virtual函數(shù)就會(huì)編譯錯(cuò)誤。避免拼錯(cuò)和記錯(cuò)沒(méi)有重寫(xiě)基類函數(shù)
?? ?{
?? ??? ?printf("Drived::A_4\n");
?? ?}
?? ?/*
?? ?void A_5() override //編譯錯(cuò)誤 'Drived::A_5': method with override specifier 'override' did not override any base class methods?? ?
?? ?{?
?? ??? ?printf("Drived::A_5\n");
?? ?}
?? ?*/
};
class Drived2 : public Drived
{
public:
?? ?void A_2() override?
?? ?{
?? ??? ?printf("Drived2::A_2\n");
?? ?}
?? ?void A_3() ?override//用基類或子類指針都調(diào)用到的是子類的A_2
?? ?{
?? ??? ?printf("Drived2::A_3\n");
?? ?}
};
class VirtualTest
{
public:
?? ?void DoTest()
?? ?{
?? ??? ?Drived *drived = new Drived();
?? ??? ?Base *base = drived;
?? ??? ?base->A_1();
?? ??? ?drived->A_1();
?? ??? ?printf("\n");
?? ??? ?base->A_2();
?? ??? ?drived->A_2();
?? ??? ?printf("\n");
?? ??? ?base->A_3();
?? ??? ?drived->A_3();
?? ??? ?printf("\n");
?? ??? ?base->A_4();
?? ??? ?drived->A_4();
?? ??? ?printf("\n");
?? ??? ?Drived2 *drived2 = new Drived2();
?? ??? ?base = drived2;
?? ??? ?drived = drived2;
?? ??? ?
?? ??? ?base->A_2();
?? ??? ?drived->A_2();
?? ??? ?drived2->A_2();
?? ??? ?printf("\n");
?? ??? ?base->A_3();
?? ??? ?drived->A_3();
?? ??? ?drived2->A_3();
?? ?}
};三、輸出
Base::A_1
Drived::A_1Drived::A_2
Drived::A_2Drived::A_3
Drived::A_3Drived::A_4
Drived::A_4Drived2::A_2
Drived2::A_2
Drived2::A_2Drived2::A_3
Drived2::A_3
Drived2::A_3
四、總結(jié)
1、基類函數(shù)沒(méi)加virtual,子類有相同函數(shù),實(shí)現(xiàn)的是覆蓋。用基類指針調(diào)用時(shí),調(diào)用到的是基類的函數(shù);用子類指針調(diào)用時(shí),調(diào)用到的是子類的函數(shù)。
2、基類函數(shù)加了virtual時(shí),實(shí)現(xiàn)的時(shí)重寫(xiě)。用基類指針或子類指針調(diào)用時(shí),調(diào)用到的都是子類的函數(shù)。
3、函數(shù)加上override,強(qiáng)制要求基本相同函數(shù)需要是虛函數(shù),否則會(huì)編譯報(bào)錯(cuò)。
4、子類的virtual可加可不加,建議加override不加virtual。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++實(shí)現(xiàn)圖書(shū)管理系統(tǒng)(文件操作與類)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書(shū)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
詳解如何在code block創(chuàng)建一個(gè)C語(yǔ)言的項(xiàng)目
這篇文章主要介紹了詳解如何在code block創(chuàng)建一個(gè)C語(yǔ)言的項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
C語(yǔ)言中的內(nèi)存泄露 怎樣避免與檢測(cè)
堆經(jīng)常會(huì)出現(xiàn)兩種類型的問(wèn)題:1.釋放或改寫(xiě)仍在使用的內(nèi)存(稱為:“內(nèi)存損壞”)。2.未釋放不再使用的內(nèi)存(稱為:“內(nèi)存泄露”)。這是最難被調(diào)試發(fā)現(xiàn)的問(wèn)題之一2013-09-09
C語(yǔ)言中動(dòng)態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)解析
C語(yǔ)言跟內(nèi)存申請(qǐng)相關(guān)的函數(shù)主要有 alloca、calloc、malloc、free、realloc等,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中動(dòng)態(tài)內(nèi)存分配malloc、calloc和realloc函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-03-03
DHCP:解析開(kāi)發(fā)板上動(dòng)態(tài)獲取ip的2種實(shí)現(xiàn)方法詳解
本篇文章是對(duì)開(kāi)發(fā)板上動(dòng)態(tài)獲取ip的2種實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

