成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C++ 運行時類型信息與繼承技巧探索

開發 前端
C++中確實有一些特性提供了對對象的運行時視圖。這些特性通常被歸為一組功能,稱為運行時類型信息(RTTI)。

運行時類型特性

相比于其他面向對象語言,C++更傾向于編譯時處理。如你之前所學,重寫方法之所以有效,是因為方法與其實現之間存在一層間接關系,而不是因為對象內置了對其所屬類的知識。然而,C++中確實有一些特性提供了對對象的運行時視圖。這些特性通常被歸為一組功能,稱為運行時類型信息(RTTI)。

RTTI提供了許多有用的特性,用于處理對象的類成員信息。其中一個特性是 dynamic_cast(),它允許你在面向對象的層次結構中安全地在類型之間轉換;這在本章前面已經討論過。在沒有虛表(即沒有虛方法)的類上使用 dynamic_cast() 會導致編譯錯誤。

有趣且不尋常的繼承問題

RTTI的第二個特性是 typeid 運算符,它允許你在運行時查詢對象的類型。大多數情況下,你不應該需要使用 typeid,因為基于對象類型有條件地運行的代碼最好通過虛方法處理。以下代碼使用 typeid 根據對象的類型打印消息:

import <typeinfo>;
class Animal { public: virtual ~Animal() = default; };
class Dog : public Animal {};
class Bird : public Animal {};

void speak(const Animal& animal) {
    if (typeid(animal) == typeid(Dog)) {
        cout << "Woof!" << endl;
    } else if (typeid(animal) == typeid(Bird)) {
        cout << "Chirp!" << endl;
    }
}

每當你看到這樣的代碼時,你應該立即考慮使用虛方法重新實現功能。在這種情況下,更好的實現方式是在 Animal 類中聲明一個名為 speak() 的虛方法。Dog 類重寫該方法以打印 "Woof!",而 Bird 類重寫該方法以打印 "Chirp!"。這種方法更符合面向對象編程的思想,即將與對象相關的功能賦予這些對象。

警告:typeid 運算符只有在類至少有一個虛方法時才能正確工作,即當類有虛表時。此外,typeid 運算符會從其參數中去除引用和常量修飾符。typeid 運算符可能對于日志記錄和調試目的有用。以下代碼展示了如何使用 typeid 進行日志記錄。logObject() 函數接受一個可記錄的對象作為參數。這種設計使得任何可以被記錄的對象都繼承自 Loggable 類,并支持一個名為 getLogMessage() 的方法。


class Loggable { public: virtual ~Loggable() = default; virtual std::string getLogMessage() const = 0; };
class Foo : public Loggable { public: std::string getLogMessage() const override { return "Hello logger."; } };

繼承技巧的發現

class Loggable {
public:
    virtual ~Loggable() = default;
    virtual std::string getLogMessage() const = 0;
};

class Foo : public Loggable {
public:
    std::string getLogMessage() const override {
        return "Hello logger.";
    }
};

void logObject(const Loggable& loggableObject) {
    cout << typeid(loggableObject).name() << ": ";
    cout << loggableObject.getLogMessage() << endl;
}

logObject() 函數首先將對象類的名稱寫入輸出流,然后是其日志消息。這樣,當你稍后閱讀日志時,你可以看到每條寫入的行是由哪個對象負責的。以下是使用 Microsoft Visual C++ 2019 編譯并調用 logObject() 函數時生成的輸出示例:

class Foo: Hello logger.

如你所見,由 typeid 運算符返回的名稱是 “class Foo”。然而,這個名稱依賴于你使用的編譯器。例如,如果你使用 GCC 編譯相同的代碼,輸出將如下所示:

3Foo: Hello logger.

注意:如果你使用 typeid 進行的目的不是日志記錄和調試,請考慮使用虛方法重新實現它。

責任編輯:趙寧寧 來源: coding日記
相關推薦

2024-12-09 13:00:00

C++類型安全

2011-08-19 15:05:29

異常處理

2010-01-27 14:14:48

C++程序運行時間

2025-03-03 09:10:00

C++開發

2022-12-30 08:08:30

2015-07-20 15:44:46

Swift框架MJExtension反射

2024-03-21 09:15:58

JS運行的JavaScrip

2011-12-27 09:39:12

C#運行時

2024-01-08 08:24:02

PythonSys 模塊工具

2020-09-28 15:54:18

Python語言技術

2018-06-24 15:23:05

軟件工程環境開發

2009-09-24 17:19:06

運行時多態性

2019-07-12 09:30:12

DashboardDockerDNS

2021-09-11 15:38:23

容器運行鏡像開放

2025-03-28 01:00:00

Go語言版本

2009-02-10 09:03:59

動態語言CLRVB.NET

2021-08-27 00:21:19

JSJust源碼

2023-02-12 12:00:57

2023-08-29 08:20:35

Kubernete跨云容器

2023-07-28 10:42:43

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩中文字幕av | 久久久久久www | 奇色影视| 精品免费国产一区二区三区四区 | 久久久久久久久国产精品 | 欧美一级片a | 日本超碰 | 亚洲精品久久久 | 欧美一级片中文字幕 | 精品亚洲一区二区三区 | 浮生影院免费观看中文版 | 亚洲二区在线 | 欧美激情国产日韩精品一区18 | 亚洲激情第一页 | 激情在线视频网站 | 美日韩免费视频 | 日韩一区在线播放 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | a中文在线视频 | 99pao成人国产永久免费视频 | 亚洲午夜在线 | 日韩在线一区二区三区 | 欧美三级视频在线观看 | 美女午夜影院 | 99热这里都是精品 | 欧美电影大全 | 久草视频在线播放 | 尹人av| 中文字幕精品视频 | 欧美视频在线观看 | 日日噜噜噜夜夜爽爽狠狠视频97 | 国产精品免费大片 | 亚洲综合一区二区三区 | 粉嫩一区二区三区国产精品 | 狠狠干影院 | 黄色免费在线网址 | 一区二区三区四区在线 | 中文字幕在线一区 | 欧美精品成人一区二区三区四区 | 国产成人精品一区二区三 | 综合精品久久久 |