牛客网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.强制多态

//强制类型转换

重载多态和强制多态称为特定多态。
参数多态和包含多态称为通用多态。

相关