编译器警告(等级 1)C4540

dynamic_cast 用于转换为不可访问或不明确的基;运行时测试将失败(“type1”到“type2”)

使用 dynamic_cast 从一种类型转换为另一种类型。 编译器确定强制转换始终会失败(返回 NULL),因为基类不可访问(例如 private)或不明确(例如在类层次结构中多次出现)

下面显示了此警告的示例。 B 类派生自 A 类。该程序使用 dynamic_cast 从 B 类(派生类)强制转换为 A 类,这始终会失败,因为 B 类是 private,因此无法访问。 将 A 的访问权限更改为 public 可解决此警告

// C4540.cpp
// compile with: /W1

struct A {
   virtual void g() {}
};

struct B : private A {
   virtual void g() {}
};

int main() {
   B b;
   A * ap = dynamic_cast<A*>(&b);   // C4540
}