C语言模式实现C++继承和多态
C实现一个struct A和struct B各包含一个int成员a和b,要求达到B继承了A的效果,也就是B里面包含一个A。并且能达到多态的效果,也就是一个A*p指向A调的是A的函数,指向B调用的是B的函数。
1. 继承
(1)C++的继承
在C++中,可以用一个类(子类)去继承另一个类(父类),子类可以得到父类的相关属性与方法。
代码实现:
#include
using namespace std;
class A
{
protected:
int _a;
};
class B:public A
{
protected:
int _b;
};
int main()
{
A a;
B b;
return 0;
}
(2)C语言模拟继承
在C语言中,我们可以在新有的结构体里面定义已有结构体的对象,在新的结构体中通过已有类的对象的访问已有类自己的成员变量与函数。
代码实现:
//继承
typedef void(*FUNC)();
struct CA //父类
{
FUNC f; //由于语言中结构体不能包含函数,所以只能用函数指针在外面实现
int _a;
};
struct CB //子类
{
CA _ca; //在子类中定义一个父类的对象即可实现对父类的继承
int _b;
};
2. 多态
(1)C++中的多态
在C++中,多态是通过virtual函数实现的。在父类中将其声明为虚函数,并且与子类中的方法的参数列表、返回值以及函数名相同。
//多态
class CPPA
{
public:
virtual void f()
{
cout << "CPPA" << endl;
}
protected:
int _a;
};
class CPPB :public CPPA
{
public:
virtual void f()
{
cout << "CPPB" << endl;
}
protected:
int _b;
};
void func(CPPA* ptr)
{
ptr->f();
}
int main()
{
CPPA cppa;
CPPB cppb;
cppa.f(); //C++实现继承与多态
cppb.f();
func(&cppa);
func(&cppb);
return 0;
}
(2)C语言模拟实现多态
利用函数指针实现
typedef void(*FUNC)();
struct CA
{
FUNC f;
int _a;
};
struct CB
{
CA _ca;
int _b;
};
void FuncCA()
{
cout << "CA" << endl;
}
void FuncCB()
{
cout << "CB" << endl;
}
void func(CA* ptr)
{
ptr->f();
}
int main()
{
CA ca; //定义一个父类对象
CB cb; //定义一个子类对象
ca.f = FuncCA; //父类中的函数指针指向函数,父类的对象调用父类的同名函数
cb._ca.f = FuncCB; //子类通过父类的对象的函数指针指向的函数,子类的对象调用子类的同名函数
func(&ca); //调用父类的同名函数
func((CA*)&cb); //让父类指针指向子类的对象,由于类型不匹配所以要进行强转,调用子类的同名函数
return 0;
}empty