#include <iostream>
using namespace std;
class A
{
public:
virtual void show(){cout << "show A:"<< --a <<endl;} //虚函数
void display(){cout << "display A:"<< --a << endl;} //非虚函数
int a = 0;
};
class B :public A
{
public:
virtual void show(){ cout << "show B:"<< ++b << endl; } //虚函数
void display(){ cout << "display B:"<< ++b << endl; } //非虚函数
int b = 1;
};
int main()
{
A *bb = (A*)new B(); //构造B对象,虚表填充是B的虚表
bb->display(); //非虚函数因此调用A对象的方法
static_cast<B*>(bb)->display(); //编译阶段绑定的,不是运行阶段,因此直接调用B的方法
bb->show(); //虚函数,虚表已经被B对象填充,因此调用B的方法
B *aa = (B*)new A(); //类型强转的没有正常的构造因此很危险
aa->display(); //非虚函数因此调用B对象的方法
static_cast<A* >(aa)->display(); //编译阶段绑定的,不是运行阶段,因此直接调用A的方法
aa->show(); //虚表填充的A因此调用A的方法
return 0;
}
C++多态
最新推荐文章于 2022-10-31 18:37:40 发布