欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++的virtual和override作用及說明

 更新時(shí)間:2022年11月05日 09:18:42   作者:游戲貓  
這篇文章主要介紹了c++的virtual和override作用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、概述

c++的virtual提供了運(yùn)行時(shí)的多態(tài),可以用基類的指針調(diào)用子類對(duì)象的函數(shù),通過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說明的是是子類的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,如果基類沒有對(duì)應(yīng)virtual函數(shù)就會(huì)編譯錯(cuò)誤。避免拼錯(cuò)和記錯(cuò)沒有重寫基類函數(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_1

Drived::A_2
Drived::A_2

Drived::A_3
Drived::A_3

Drived::A_4
Drived::A_4

Drived2::A_2
Drived2::A_2
Drived2::A_2

Drived2::A_3
Drived2::A_3
Drived2::A_3

四、總結(jié)

1、基類函數(shù)沒加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í)重寫。用基類指針或子類指針調(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++11 Lambda表達(dá)式

    一文讀懂c++11 Lambda表達(dá)式

    這篇文章主要介紹了c++11 Lambda表達(dá)式的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)C++,感興趣的朋友可以了解下
    2020-08-08
  • C++數(shù)據(jù)結(jié)構(gòu)分析多態(tài)的實(shí)現(xiàn)與原理及抽象類

    C++數(shù)據(jù)結(jié)構(gòu)分析多態(tài)的實(shí)現(xiàn)與原理及抽象類

    繼承就是可以直接使用前輩的屬性和方法。自然界如果沒有繼承,那一切都是處于混沌狀態(tài)。多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。多態(tài)就是同一個(gè)接口,使用不同的實(shí)例而執(zhí)行不同操作
    2022-02-02
  • C++中map和set封裝實(shí)現(xiàn)示例

    C++中map和set封裝實(shí)現(xiàn)示例

    我們知道,map與set所使用的都是紅黑樹,下面這篇文章主要給大家介紹了關(guān)于C++中map和set封裝實(shí)現(xiàn)的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • C語(yǔ)言冷知識(shí)之預(yù)處理字符串操作符詳解

    C語(yǔ)言冷知識(shí)之預(yù)處理字符串操作符詳解

    當(dāng)年學(xué)習(xí)C語(yǔ)言的第一門課就提到過標(biāo)記(Token)的概念,不過,相信在多年之后你再次聽到這個(gè)術(shù)語(yǔ)時(shí)會(huì)一臉懵逼,比如我。因此特地翻了翻資料,整理下來這些筆記,希望對(duì)大家有所幫助
    2022-11-11
  • C++條件語(yǔ)句和條件運(yùn)算符的使用方法講解

    C++條件語(yǔ)句和條件運(yùn)算符的使用方法講解

    這篇文章主要介紹了C++條件語(yǔ)句和條件運(yùn)算符的使用方法講解,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • 最新評(píng)論