C语言是一个面向过程的语言
C++是一个由C语言发展来的面向对象语言,在C++中有继承和多态(用virtual关键字实现)。
继承:
继承是通过已有的类派生出新的类,新的类包含已有类的成员对象和成员函数,并且可以增加新的功能,已有的类被称为父类/基类,新的类被称为子类/派生类。
多态:
子类对父类的虚函数进行重写,通过父类指针或引用来指向或引用父类的对象和子类的对象,来实现对子类和父类重写虚函数的调用,从而实现一种接口,多种方法。即多态。
我们先看C++如何实现多态:
#include<iostream>
using namespace std;
//C++实现继承和多态
class A
{
public:
virtual void fun() //C++中用virtual实现多态
{
cout << "A::fun()" << endl;
}
private:
int _a;
};
class B :public A //B继承A
{
public:
virtual void fun()
{
cout << "B::fun()" << endl;
}
private:
int _b;
};
void TestCplusplus()
{
A a; //父类对象
B b; //子类对象
A* p; //父类指针
p = &a; //父类指针指向父类对象
p->fun();
p = &b; //父类指针指向子类对象
p->fun();
}
运行结果:
C语言模拟实现继承和多态:
//C语言模拟实现继承和多态
typedef void (*FUN)(); //通过函数指针来实现对成员函数的继承和多态
struct _A //父类
{
FUN _fun; //C语言struct不能包含函数,故需要在类外实现
int _a;
};
struct _B //子类
{
_A aa; //通过子类包含父类对象实现继承
int _b;
};
//定义两个函数---通过函数指针来决定指向那个函数实现多态
void _funA() //父类的同名函数
{
printf("_A::_funA()\n");
}
void _funB() //子类的同名函数
{
printf("_B::_funB()\n");
}
void TestC()
{
_A a; //定义父类对象
_B b; //定义子类对象
a._fun = _funA; //给父类对象的函数指针赋值_funA函数
b.aa._fun = _funB; //给子类对象的函数指针赋值_funB函数
_A* p; //定义指向父类的指针
p = &a; //父类指针指向父类对象
p->_fun(); //父类指针调用父类的同名函数
p = (_A*)&b; //父类指针指向子类对象(由于C语言不支持不同类型赋值,故需转换指针类型)
p->_fun(); //父类指针调用子类的同名函数
}
运行结果: