C++ 面试题 目录

C++ 中如何实现运行时多态 (RTTI)?

推荐答案

在C++中,运行时多态(RTTI,Run-Time Type Information)主要通过以下两种机制实现:

  1. 虚函数(Virtual Functions):通过基类指针或引用调用派生类的重写函数。
  2. typeid 运算符:用于获取对象的实际类型信息。

示例代码

-- -------------------- ---- -------
-------- ----------
-------- ----------

----- ---- -
-------
    ------- ---- ------ -
        --------- -- ----- ------ -- ----------
    -
--

----- ------- - ------ ---- -
-------
    ---- ------ -------- -
        --------- -- -------- ------ -- ----------
    -
--

--- ------ -
    ----- ------- - --- ----------
    
    -- ------------
    ----------------  -- --- ------- -----
    
    -- -- ------ ---------
    --------- -- ----- -- -------- - -- ----------------------- -- ----------  -- --- -------
    
    ------ --------
    ------ --
-

本题详细解读

1. 虚函数(Virtual Functions)

虚函数是实现运行时多态的核心机制。通过在基类中声明虚函数,并在派生类中重写这些函数,可以在运行时根据对象的实际类型调用相应的函数。

  • 虚函数表(VTable):每个包含虚函数的类都有一个虚函数表,表中存储了指向实际函数的指针。当通过基类指针或引用调用虚函数时,程序会根据对象的实际类型查找虚函数表,并调用正确的函数。
  • override 关键字:C++11引入了override关键字,用于显式标记派生类中重写的虚函数,避免因函数签名不匹配而导致的错误。

2. typeid 运算符

typeid 运算符用于在运行时获取对象的类型信息。它返回一个std::type_info对象,其中包含了类型的名称等信息。

  • typeid 的使用场景:通常用于调试、日志记录或类型检查。需要注意的是,typeid 只能用于多态类型(即包含虚函数的类),否则返回的是静态类型信息。
  • type_infotypeid 返回的对象是std::type_info类型的实例,可以通过name()方法获取类型的名称。

3. 运行时多态的应用

运行时多态在C++中广泛应用于以下场景:

  • 接口设计:通过基类定义接口,派生类实现具体功能,从而实现灵活的代码扩展。
  • 工厂模式:通过基类指针返回不同类型的派生类对象,隐藏具体实现细节。
  • 动态类型检查:在需要根据对象类型执行不同操作的场景中,使用typeid进行类型判断。

通过虚函数和typeid的结合使用,C++实现了强大的运行时多态机制,使得程序能够在运行时根据对象的实际类型执行相应的操作。

纠错
反馈