牛客网C++趣题趣谈3
17. 虚函数的默认参数
考虑下面的代码,调用哪个函数?输出什么?
class A
{
public:
virtual void func(int val = 1)
{ std::cout<<"A->"<"<test();
return 0;
}
答案是,调用B::func,但是输出"B->1",这是因为C++中,虚函数可以动态绑定,但是默认参数还是静态的,test函数是A中的,因此调用B中func时仍然传递A中的默认参数0!
这样的语法耗子药没人喜欢,因此请避免在虚函数中使用默认参数!
18. 多继承虚指针布局
答案为A。对于含有虚函数的多继承来说,指针经过转化后不一定相等了,对于有包含虚指针的多继承类,他的虚指针和第一个基类对齐。因此指针转化为第一个基类后不变,转化成其他基类后变化。
19. 各种alloc的区别
- malloc:申请一块给定大小的堆中的内存(不会初始化),最常用,失败返回NULL
- calloc:申请n块给定大小的空间(但是时连在一起的,其实还是一块),并且做初始化,失败返回NULL。
- realloc:用于malloc和calloc申请的内存,进行扩容到指定大小,有可能失败返回NULL,有可能成功,返回原地址,也有可能返回新地址,此时原地址不会释放。
- alloc:少见。申请栈内存,不用释放。
20. 特定多态和通用多态
多态是面对对象的三个特性之一,不过多态这个词本身不限于此,只要是“一种函数功能,多种实现”的思想,都可以称之为多态。
C++中多态的形式可以表现为4种,搬运牛客网大佬的:、
//1.参数多态
//包括函数模板和类模板
//2.包含多态 virtual
class A{
virtual void foo() {printf("A virtual void foo()");}
};
class B : public A {
void foo() {printf("B void foo()");}
};
void test() {
A *a = new B();
a->foo(); // B void foo()
}
//3.重载多态
//重载多态是指函数名相同,但函数的参数个数或者类型不同的函数构成多态
void foo(int);
void foo(int, int);
//4.强制多态
//强制类型转换
重载多态和强制多态称为特定多态。
参数多态和包含多态称为通用多态。