C++ 一个类的构造函数,另一个类的构造函数。。将调用什么函数?

C++ 一个类的构造函数,另一个类的构造函数。。将调用什么函数?,c++,casting,constructor,C++,Casting,Constructor,我有两个类,A和B,都有函数g() 如果我这样做: (A*) a = (A*) new B; a->g(); 将调用哪个类的函数g()?如果A声明该函数为虚拟函数,并且B继承A并重写它,则将调用B::g 如果它不是虚拟的,或者没有被覆盖,那么将调用A::g 如果B没有继承自A,则该行为未定义,可能会发生任何情况。您可以通过使用隐式转换来避免此错误,编译器仅在已知有效的情况下才允许隐式转换,而不是最危险的类型转换,它将允许大多数指针转换,无论它们是否合理。如果A声明函数为虚拟函数,而B继

我有两个类,A和B,都有函数g()

如果我这样做:

(A*) a = (A*) new B;

a->g();

将调用哪个类的函数g()?

如果
A
声明该函数为虚拟函数,并且
B
继承
A
并重写它,则将调用
B::g

如果它不是虚拟的,或者没有被覆盖,那么将调用
A::g


如果
B
没有继承自
A
,则该行为未定义,可能会发生任何情况。您可以通过使用隐式转换来避免此错误,编译器仅在已知有效的情况下才允许隐式转换,而不是最危险的类型转换,它将允许大多数指针转换,无论它们是否合理。

如果
A
声明函数为虚拟函数,而
B
继承自
A
并重写它,然后将调用
B::g

如果它不是虚拟的,或者没有被覆盖,那么将调用
A::g


如果
B
没有继承自
A
,则该行为未定义,可能会发生任何情况。您可以通过使用隐式转换来避免此错误,编译器仅在已知有效的情况下才允许隐式转换,而不是最危险的类型转换,它将允许大多数指针转换,无论它们是否合理。

如果
A
声明函数为虚拟函数,而
B
继承自
A
并重写它,然后将调用
B::g

如果它不是虚拟的,或者没有被覆盖,那么将调用
A::g


如果
B
没有继承自
A
,则该行为未定义,可能会发生任何情况。您可以通过使用隐式转换来避免此错误,编译器仅在已知有效的情况下才允许隐式转换,而不是最危险的类型转换,它将允许大多数指针转换,无论它们是否合理。

如果
A
声明函数为虚拟函数,而
B
继承自
A
并重写它,然后将调用
B::g

如果它不是虚拟的,或者没有被覆盖,那么将调用
A::g



如果
B
没有继承自
A
,则该行为未定义,可能会发生任何情况。您可以通过使用隐式转换来避免此错误,编译器仅在已知有效的情况下才允许隐式转换,而不是最危险的类型转换,它将允许大多数指针转换,无论它们是否有意义。

A
的基础
B
g()
是否声明为虚拟?为什么不试试呢?输入A
printf的函数(“在A中”)和在B的功能中a
printf(“在B中”)。编译、执行,您将看到…-)@sternze-它可能是UB,测试可能是无用的,甚至是有害的/误导性的(特别是因为这是一个c风格的转换)。这不会产生一个模糊的结果吗?基本上,在这种情况下,如果转换是绝对必要的(编译时没有错误),那么您有未定义的行为。是
a
的基础还是
B
g()
是否声明为虚拟?为什么不试试呢?输入A
printf的函数(“在A中”)和在B的功能中a
printf(“在B中”)。编译、执行,您将看到…-)@sternze-它可能是UB,测试可能是无用的,甚至是有害的/误导性的(特别是因为这是一个c风格的转换)。这不会产生一个模糊的结果吗?基本上,在这种情况下,如果转换是绝对必要的(编译时没有错误),那么您有未定义的行为。是
a
的基础还是
B
g()
是否声明为虚拟?为什么不试试呢?输入A
printf的函数(“在A中”)和在B的功能中a
printf(“在B中”)。编译、执行,您将看到…-)@sternze-它可能是UB,测试可能是无用的,甚至是有害的/误导性的(特别是因为这是一个c风格的转换)。这不会产生一个模糊的结果吗?基本上,在这种情况下,如果转换是绝对必要的(编译时没有错误),那么您有未定义的行为。是
a
的基础还是
B
g()
是否声明为虚拟?为什么不试试呢?输入A
printf的函数(“在A中”)和在B的功能中a
printf(“在B中”)。编译、执行,您将看到…-)@sternze-它可能是UB,测试可能是无用的,甚至是有害的/误导性的(特别是因为这是一个c风格的转换)。这不会产生一个模糊的结果吗?基本上,在这种情况下,如果转换是绝对必要的(编译时没有错误),那么您有未定义的行为。