C++笔记:虚函数,纯虚函数,抽象类,多态性
1.虚函数:
被virtual 关键字修饰的成员函数。作用是实现成员函数的动态重载。
// --------- 示例 -------- //
#include <iostream>
using namespace std;
class A {
public:
void print() {
cout << "this is A" << endl;
}
};
class B :public A {
public:
void print() {
cout << "this is B" << endl;
}
};
int main() {
// -------- part 1 -------- //
cout << "This part is part 1" << endl;
A a1;
B b1;
a1.print();
b1.print();
// -------- part 2 -------- //
cout << "This part is part 2" << endl;
A a2;
B b2;
A* p1 = &a2;
A* p2 = &b2;
p1->print();
p2->print();
return 0;
}
运行结果:
在part2 中,将p2 只向了B对象,调用的却是A对象的print 方法,这不是我们预期的效果。
稍作改动,将基类中的print 函数改为虚函数。
class A {
public:
virtual void print() {
cout << "this is A" << endl;
}
};
运行结果:
2.纯虚函数
特殊的虚函数, 在多数情况下,在基类中不能对虚函数给出有意义的实现,由派生类实现。
存虚函数也可称为抽象函数,一般来说只有函数名,参数,返回值类型,没有函数体。
基类中的实现示例
class A {
public:
virtual void print() = 0;
};
3. 抽象类
包含纯虚函数的类称为抽象类, 由于包含了没有定义的纯虚函数,故不能定义抽象类对象。
4. 多态性
指相同对象收到不同消息,或不同对象收到相同的消息产生不同的实现动作。C++支持两种多态性,编译时多态性与运行时多态性。
(举例:相同对象收到不同消息,应该就例如函数重载,相同的名字相同的函数,收到不同类型的参数,执行对应的函数体。
不同对象收到相同函数,例如通过抽象函数,让派生类可以接受同样的消息?)
(1)编译时多态性:重载函数和运算符重载实现
(2)运行时多态性:通过虚函数和继承实现
5. 不能声明为虚函数的函数
- 非成员函数
- 静态成员函数
- 内联成员函数
- 构造函数
- 友元函数
参考
[1] 度娘:关键字 + “定义”