C++多层继承场景下绑定机制疑问:示例代码调用哪个Validate方法
C++多层继承场景下的虚函数调用问题解答
首先明确:你给出的示例代码无法正常编译运行,存在三个核心问题
- 函数签名不匹配,不构成虚函数重写:基类
Tester声明的virtual void Validate()是无参函数,子类Test1、Test2定义的是带参的Validate(...),二者签名不一致,不会被编译器识别为重写关系,虚函数动态绑定不会生效。 - 继承权限问题:C++中class的默认继承方式为私有继承,
Test1 : Tester等价于Test1 : private Tester,私有继承下外部代码无法完成派生类到基类的类型转换,你调用RunTest(test_candidate)会直接编译报错。 - 值传递触发对象切片:就算你修复了前两个问题,
RunTest的参数是值类型Tester test,传入Test2对象时只会拷贝基类Tester的成员,派生类的部分会被完全切掉,此时的test本质就是纯Tester对象,不会触发动态绑定。
修正后可触发动态绑定的场景结论
如果你把代码修正为:
- 基类和子类的
Validate函数签名完全一致 - 继承改为公有继承:
class Test1 : public Tester、class Test2 : public Test1 RunTest参数改为引用或指针:void RunTest(Tester& test)或者void RunTest(Tester* test)
此时多层继承下的动态绑定完全生效,调用的是Test2类的Validate方法,C++的虚函数机制支持任意层数的继承场景下的动态绑定。
内容的提问来源于stack exchange,提问作者bayesianpower
相关产品推荐
相关产品推荐

