考虑下面的代码,调用哪个函数?输出什么?
class A { public: virtual void func(int val = 1) { std::cout<<"A->"<<val <<std::endl;} virtual void test() { func();} }; class B : public A { public: void func(int val=0) {std::cout<<"B->"<<val <<std::endl;} }; int main(int argc ,char* argv[]) { B*p = new B; p->test(); return 0; }
答案是,调用B::func,但是输出"B->1",这是因为C++中,虚函数可以动态绑定,但是默认参数还是静态的,test函数是A中的,因此调用B中func时仍然传递A中的默认参数0!
这样的语法耗子药没人喜欢,因此请避免在虚函数中使用默认参数!
答案为A。对于含有虚函数的多继承来说,指针经过转化后不一定相等了,对于有包含虚指针的多继承类,他的虚指针和第一个基类对齐。因此指针转化为第一个基类后不变,转化成其他基类后变化。