C/C++教程

牛客网C++趣题趣谈3

本文主要是介绍牛客网C++趣题趣谈3,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

17. 虚函数的默认参数

考虑下面的代码,调用哪个函数?输出什么?

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!

这样的语法耗子药没人喜欢,因此请避免在虚函数中使用默认参数!

18. 多继承虚指针布局

image

答案为A。对于含有虚函数的多继承来说,指针经过转化后不一定相等了,对于有包含虚指针的多继承类,他的虚指针和第一个基类对齐。因此指针转化为第一个基类后不变,转化成其他基类后变化。

image

这篇关于牛客网C++趣题趣谈3的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!