如果A没有虚函数,为什么会编译?
A
class A { int a = 42; }; class B { void* f() { return dynamic_cast<A*>(this); } virtual void my_virtual() {}; };
注意:虽然写这样的东西没有意义,但这是在基类被删除后重构的结果。我觉得应该有一个编译器错误。
qhhrdooz1#
因为这不是一个要求,也不应该是一个错误。考虑在类中添加以下内容(将B::f()设置为公共之后):
B::f()
class C: public A, public B { }; int main() { C c; void* p = c.f(); }
其应该并且确实向p返回指向c的A子对象的指针。只有转换源需要为多态类型,并且只有在编译时不知道目标是源的基类时才需要。在后一种情况下,一个好的编译器在运行时不会做任何转换。
p
c
1条答案
按热度按时间qhhrdooz1#
因为这不是一个要求,也不应该是一个错误。
考虑在类中添加以下内容(将
B::f()
设置为公共之后):其应该并且确实向
p
返回指向c
的A
子对象的指针。只有转换源需要为多态类型,并且只有在编译时不知道目标是源的基类时才需要。
在后一种情况下,一个好的编译器在运行时不会做任何转换。