我有两个类,A和B,都有函数g()。
如果我这样做:
(A*) a = (A*) new B;
a->g();
函数g()将调用哪个类?
答案 0 :(得分:3)
如果A
声明该功能是虚拟的,并且B
继承自A
并覆盖它,则会调用B::g
。
如果它不是虚拟的,或者没有被覆盖,则会调用A::g
。
如果B
未从A
继承,则行为未定义且任何事情都可能发生。您可以通过使用隐式转换来避免此错误,只有在知道它是有效的情况下编译器才允许这种转换,而不是最危险的转换类型,这将允许大多数指针转换,无论它们是否有意义。