目录
第十一章 接口与继承
1、覆盖
1 A* pa = new A(); 2 pa->foo(); 3 B* pb = (B*)pa; //此时pa仍然是指向A的类对象,因此pb也指向A的类对象

1 #include <iostream>
2 using namespace std;
3
4 class A
5 {
6 public:
7 void virtual foo()
8 {
9 cout << "A" << endl;
10 }
11 };
12 class B :public A
13 {
14 public:
15 void virtual foo() //这里不加virtual也是可以的,只要基类中加派生类同名函数自动成为虚函数
16 {
17 cout << "B" << endl;
18 }
19 };
20 int main()
21 {
22 A* pa = new A(); //创建指向A类对象的指针pa
23 pa->foo(); //由于pa是基类指针,所以执行基类A中的函数foo()
24 B* pb = (B*)pa; //将pa转换为B类型并创建B类型指针,最后将pa赋值给pb,但是pa仍然指向基类的类对象,所以pb也指向基类的类对象
25 pb->foo(); //执行基类A中的函数foo()
26 delete pa, pb;
27
28 pa = new B(); //此时pa指向了派生类的类对象
29 pa->foo(); //执行派生类中的函数foo()
30 pb = (B*)pa;
31 pb->foo(); //执行派生类中的函数foo()
32
33 system("pause");
34 return 0;
35 }

来源:https://www.cnblogs.com/YiYA-blog/p/12630554.html
