C++ 一个类的构造函数,另一个类的构造函数。。将调用什么函数?
我有两个类,A和B,都有函数g() 如果我这样做: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*) 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()
是否声明为虚拟?为什么不试试呢?输入Aprintf的函数(“在A中”)代码>和在B的功能中aprintf(“在B中”)代码>。编译、执行,您将看到…-)@sternze-它可能是UB,测试可能是无用的,甚至是有害的/误导性的(特别是因为这是一个c风格的转换)。这不会产生一个模糊的结果吗?基本上,在这种情况下,如果转换是绝对必要的(编译时没有错误),那么您有未定义的行为。是a
的基础还是B
?g()
是否声明为虚拟?为什么不试试呢?输入Aprintf的函数(“在A中”)代码>和在B的功能中aprintf(“在B中”)代码>。编译、执行,您将看到…-)@sternze-它可能是UB,测试可能是无用的,甚至是有害的/误导性的(特别是因为这是一个c风格的转换)。这不会产生一个模糊的结果吗?基本上,在这种情况下,如果转换是绝对必要的(编译时没有错误),那么您有未定义的行为。是a
的基础还是B
?g()
是否声明为虚拟?为什么不试试呢?输入Aprintf的函数(“在A中”)代码>和在B的功能中aprintf(“在B中”)代码>。编译、执行,您将看到…-)@sternze-它可能是UB,测试可能是无用的,甚至是有害的/误导性的(特别是因为这是一个c风格的转换)。这不会产生一个模糊的结果吗?基本上,在这种情况下,如果转换是绝对必要的(编译时没有错误),那么您有未定义的行为。是a
的基础还是B
?g()
是否声明为虚拟?为什么不试试呢?输入Aprintf的函数(“在A中”)代码>和在B的功能中aprintf(“在B中”)代码>。编译、执行,您将看到…-)@sternze-它可能是UB,测试可能是无用的,甚至是有害的/误导性的(特别是因为这是一个c风格的转换)。这不会产生一个模糊的结果吗?基本上,在这种情况下,如果转换是绝对必要的(编译时没有错误),那么您有未定义的行为。