virtual

目录

1、virtual

2、虚函数中的默认参数

3、虚函数和内联函数

4、纯虚函数和抽象类


1、virtual

1)虚函数的调用取决于对象开辟空间的类型,而不是指针或者引用指向的类型;(多态)

2)含有虚函数的类,有虚函数表和虚函数指针;

3)虚函数表:每一个含有虚函数的类都会维护一个虚函数表,在表内,按顺序记录虚函数的地址;

4)虚函数指针:一个指向虚函数表的指针,每个对象都会拥有一个这样的指针;

5)虚函数指针通过this来访问,所以虚函数不能是static函数;

6)虚函数表在编译阶段创建,虚函数指针在构造中创建,所以构造函数不能是虚函数;

7)一个类可能被继承,那么最好将析构函数声明为虚函数,以防对象析构时调错析构函数。

2、虚函数中的默认参数

#include <iostream>
using namespace std;

class A
{
public:
	virtual void fun(int x = 1)
	{
		cout << "A, x = " << x << endl;
	}
};

class B : public A
{
public:
	virtual void fun(int x = 2)
	{
		cout << "B, x = " << x << endl;
	}
};

int main()
{
	B b;
	A *pA = &b;
	pA->fun();
	b.fun();
	system("pause");
}
/*
输出结果:
B, x = 1
B, x = 2
*/

总结:

调用函数的类型是什么,就用该类型的默认参数。

1)调用函数对象的类型是什么,就调用那个类型的函数:pA的类型是A,所以输出1、b的类型是B,所以输出2;

2)默认参数不包含在函数签名中,所以默认参数不是用来判断函数是否相同的条件;

3)尽量不要重新定义继承来的默认参数。

3、虚函数和内联函数

inline可以修饰虚函数,但是一般不会定义内联虚函数。

1)内联函数:编译器在编译阶段进行展开,而虚函数的多态是在程序运行期间,因此虚函数为多态性质时不可以内联;

2)inline virtual 唯一可以内联的时候是:编译器具有实际对象而不是对象的指针或引用时才会发生,在这种情况下不会发生多态。

4、纯虚函数和抽象类

1)纯虚函数:含有virtual void funtion()=0;类型的函数。纯虚函数要求继承类必须实现该方法;

2)抽象类:含有纯虚函数的类是抽象类,抽象类不允许创建对象。

纯虚函数的特点:

1)必须在继承类中重新声明该函数,否则继承类仍为抽象类,程序无法编译通过;

2)派生类仅仅只是继承纯虚函数的接口,因此使用纯虚函数可以规范接口形式;

3)抽象类可以作为一种类型。可以使用指针或者引用指向它。

 



 

 

发布了44 篇原创文章 · 获赞 54 · 访问量 7043

猜你喜欢

转载自blog.csdn.net/Liu_Xiao_Ming/article/details/103965733