关键词 :执行期间 动态联编
#include <iostream>
//////////////////////////////////
//多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,
//但因个体差异而采用不同的策略
//多态:一切用来指向基类的指针或引用来操作对象
//////////////////////////////////
using namespace std;
class A{
public:
virtual void print(){
cout<<"A"<<endl;
}
};
class B:public A
{
public:
void print(){
cout<<"B"<<endl;
}
};
int main()
{
A a;
B b;
A * p1 = &a;
A * p2 = &b;
p1 -> print();
p2 -> print();
return 0;
}
基类对象指针:根据类型(基类)找函数
#include <iostream>
using namespace std;
class A{
public:
void print(){
cout<<"A"<<endl;
}
};
class B:public A
{
public:
void print(){
cout<<"B"<<endl;
}
};
int main()
{
A a;
B b;
A * p1 = &a;
A * p2 = &b;
p1 -> print();
p2 -> print();
return 0;
}
多态性未体现:
#include <iostream>
using namespace std;
class A{
public:
void print(){
cout<<"A"<<endl;
}
};
class B:public A
{
public:
void print(){
cout<<"B"<<endl;
}
};
int main()
{
A a;
B b;
a.print();
b.print();
return 0;
}
基类成员函数用virtual修饰:
1,基类大小多出4个字节
指针 _vfptr 指向一个 函数指针数组
数组中保存所有虚函数的地址
2,派生类继承基类,会继承基类的函数指针里元素
3,若果派生类有重写,那么重写后的函数地址会覆盖函数指针数组里的函数地址
4,调用函数时,会去虚函数表中找函数
#include <iostream>
using namespace std;
class A
{
public:
virtual void show() {
cout << "A" << endl;
}
virtual void show2() {
cout << "A" << endl;
}
void show3() {
cout << "A" << endl;
}
};
class B :public A
{
public:
void show() {
cout << "B" << endl;
}
};
class C :public A
{
public:
void show() {
cout << "C" << endl;
}
};
int main()
{
A a;
B b;
while (1);
}
断点调试监视:
红色箭头:继承基类函数指针里的元素,重写函数地址
紫红箭头:继承基类函数指针里的元素,空间不同
亮青箭头:继承基类函数指针里的元素
监视方法:
1,首先断点
2,本地windos调试
3,打开监视窗口
调试->窗口->监视,任选其一
4,拖拽变量到监视窗口
动手思考:
编写程序定义一个车(vehicle)基类,有Run、Stop等成员函数,由此派生出自行车(bicycle)类、汽车类(motorcar),
从bicycle类和motorcar类派生出摩托车类(motorcycle),它们都有Run、Stop等成员函数。
在main()函数中定义vehicle、bicycle、motorcar、motorcycle的对象,
调用其Run()、Stop()函数,观察其执行情况。
再分别用vehicle类型的指针来调用几个对象的成员函数,看看能否成功;
把Run、Stop定义为虚函数,再试看。程序名:lab8_2.cpp。