C++如何判断声明为基类的对象,是否某子类型的实例?

我有如下类结构

BaseToken
|-- KeywordToken
     |-- ThisToken
     |-- IfToken
     |-- ...
1
2
3
4
5

并定义有:

BaseToken lastToken;
1

有一个地方需要判断 lastToken 是否是 KeywordToken

if(dynamic_cast<KeywordToken *>(lastToken)){}
1

但是编译时报错如下:

LexicalAnalyzer.cpp|444| error: cannot dynamic_cast ((LexicalAnalyzer*)this)->LexicalAnalyzer::lastToken’ (of typeclass BaseToken’) to type `class KeywordToken*’ (source is not a pointer)

貌似不能将父类型转为子类型,那么请问如何判断 lastTokenKeywordToken ?

经过“帅的不敢出门提点

dynamic_cast < type-id > ( expression )

The type-id must be a pointer or a reference to a previously defined class type or a “pointer to void”. The type of expression must be a pointer if type-id is a pointer, or an l-value if type-id is a reference.

dynamic_cast 需要的是一个指针,将代码改为如下即可:

if(dynamic_cast<KeywordToken *>(&lastToken)){}
1

参考

  1. 如何在运行时确定对象类型(RTTI)
  2. dynamic_cast
Help
[count]gg 跳转到第 [count] 行,默认第 1 行。
[count]G 跳转到第 [count] 行,默认最后一行。
[count]j 向下跳转 [count] 行,默认跳转一行。
[count]k 向上跳转 [count] 行,默认跳转一行。
/ 开始搜索。按 <Esc> 退出。
gh 跳转到首页。
gb 跳转到博客首页。
gw 跳转到 Wiki 首页。
gt 跳转到我的 Twitter Profile 页。
gp 跳转到我的 Github Profile 页。
? 打开帮助。按 <Esc> 退出。