網(wǎng)站首頁 編程語言 正文
一、概述
c++的virtual提供了運行時的多態(tài),可以用基類的指針調(diào)用子類對象的函數(shù),通過override可以強制要求基類有對應的虛函數(shù)。
二、測試代碼
#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)用時調(diào)用到的時基類的A_1,用子類指針調(diào)用時調(diào)用到的時子類的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,如果基類沒有對應virtual函數(shù)就會編譯錯誤。避免拼錯和記錯沒有重寫基類函數(shù)
?? ?{
?? ??? ?printf("Drived::A_4\n");
?? ?}
?? ?/*
?? ?void A_5() override //編譯錯誤 '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
四、總結
1、基類函數(shù)沒加virtual,子類有相同函數(shù),實現(xiàn)的是覆蓋。用基類指針調(diào)用時,調(diào)用到的是基類的函數(shù);用子類指針調(diào)用時,調(diào)用到的是子類的函數(shù)。
2、基類函數(shù)加了virtual時,實現(xiàn)的時重寫。用基類指針或子類指針調(diào)用時,調(diào)用到的都是子類的函數(shù)。
3、函數(shù)加上override,強制要求基本相同函數(shù)需要是虛函數(shù),否則會編譯報錯。
4、子類的virtual可加可不加,建議加override不加virtual。
原文鏈接:https://blog.csdn.net/gamekit/article/details/105500189
相關推薦
- 2022-05-11 深入理解AQS之獨占鎖ReentrantLock源碼分析
- 2022-06-06 layui 日期格式不正確(date、datetime)區(qū)別
- 2022-06-18 datagridview實現(xiàn)手動添加行數(shù)據(jù)_C#教程
- 2022-11-18 Redis?存儲對象信息用?Hash?和String的區(qū)別_Redis
- 2022-07-26 protected修飾的構造方法在不同包中的使用
- 2022-04-12 yarn:info There appears to be trouble with your ne
- 2022-05-29 C#中使用HttpPost調(diào)用WebService的方法_C#教程
- 2022-10-06 Python時間戳與日期格式之間相互轉化的詳細教程_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支