c++有多态的特性,所以我们可以写出很抽象的代码,例如有如下的继承结构:
class Employee
{
public:
virtual ~Employee();
virtual int GetSaraly() const = 0;
private:
int m_nSaraly;
};
class Programmer : public Employee
{
...
public:
virtual int GetSalary() const
{
m_nSaraly = ...;
return m_nSaraly;
}
};
class Manager : public Employee
{
...
public:
virtual int GetSalary() const
{
m_nSaraly = ...;
return m_nSaraly;
}
};
一个打印工资的函数可以是这样:
void PrintSaraly(Employee* pEmployee)
{
cout << pEmployee->GetSaraly() << endl;
}
PrintSaraly既可以打印出Programmer的工资,也可以打印Manager的工资,若有第三种员工,PrintSaraly可以不做任何修照样处理不误。用OO的术语来讲,这是因为设计符合了OCP。
在C里面要达到同样的效果,该怎么办?C里面也可以做到,只是稍嫌麻烦。把class Employee换成struct Employee就可以实现。代码如下:
typedef int (*GetSalary)(void);
typedef struct tagEmployee
{
GetSalary saralyPtr;
} Employee;
int GetSaralyOfProgrammer(void)
{
int nSaraly = ...;
return nSaraly;
}
int GetSaralyOfManager(void)
{
int nSaraly = ...;
return nSaraly;
}
C版本的PrintSaraly则变成了如下这个样子:
void PrintSaraly(Employee* pEmployee)
{
int nSaraly = (*pEmployee->saralyPtr)();
printf("%d\r\n", nSaraly);
}
通过给struct Employee的saralyPtr设置不同的函数地址,同样达到了多态的目的。例如,在需要打印Programmer的工资时,我们可以这样:
Employee employee;
employee.saralyPtr = GetSaralyOfProgrammer;
PrintSaraly(employee);
打印manager的工资也很类似:
Employee employee;
employee.saralyPtr = GetSaralyOfManager;
PrintSaraly(employee);
c版本的PrintSaraly不做任何修改的情况下也能处理新的员工类型,只需要添加一个GetSaralyOfXXX的函数就行。
那这种模拟究竟有什么用呢?不要以为我吃饱了饭没事做,在只能用C编程的地方,这种模拟还是很多的。
分享到:
相关推荐
这种方法虽然不完全等同于C++的多态,但确实可以在一定程度上模拟C++的面向对象行为。它允许我们使用通用的接口处理不同类型的对象,实现动态绑定。 然而,C语言的这种实现方式有一些限制。例如,它无法实现C++的...
以下将详细介绍如何用C语言模拟C++的封装、继承和多态。 1. 封装: C++中的封装是通过类(class)来实现的,它将数据和操作数据的方法绑定在一起,形成一个独立的单元。在C语言中,我们可以通过结构体(struct)来...
3. C++多态: * 静态多态:编译时多态是通过重载函数来实现的。 * 动态多态:在函数执行期间(非编译期)判断所引用对象的实际类型,根据实际类型的调用相应的方法。 4. C语言实现多态: * 使用struct结构体来...
本主题探讨的是如何用C语言来模拟C++的类结构,以应对面试中的此类问题。 首先,理解C++类的核心概念是关键。类在C++中是封装数据和函数的蓝图,它定义了一组属性(数据成员)和方法(成员函数)。在C语言中,我们...
总的来说,虽然C语言没有像C++或Java那样的内置多态机制,但通过巧妙地使用函数指针、结构体以及设计模式,我们可以构建出具有多态特性的系统。不过,需要注意的是,这种模拟的多态性可能会带来额外的复杂性和开销,...
多态性是通过虚函数(在C++中)或接口(在Java中)实现的,但在C语言中,我们可以使用函数指针和动态绑定来模拟这一概念。每个类可以有一个函数指针数组,其中每个元素对应一个虚函数。在运行时,通过对象的类型信息...
本篇文章主要介绍了C语言模拟实现C++的继承与多态示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
C模拟C++的部分,则可能涉及到如何利用C语言的特性来实现C++中的面向对象特性,如封装、继承和多态。这通常涉及到对C++内存管理机制的理解,包括动态内存分配、构造函数和析构函数的使用,以及如何在C语言环境中模拟...
在这个“C语言:多态(单继承实现)”的案例中,我们将探讨如何利用C语言来实现类似于C++中的单继承多态特性。 首先,让我们了解什么是多态。在面向对象编程中,多态是指一个接口可以有多种不同的行为或表现形式。这...
4. 代码生成:查看Cfront如何将AST转换为C代码,包括如何模拟C++的特性。 5. 错误处理:了解Cfront如何检测和报告语法错误或类型不匹配等问题。 总的来说,Cfront源码是一个学习C++和编译原理的宝贵资源,对于有志...
但在C语言中,我们可以使用一些技巧来模拟多态行为。本主题将探讨如何通过函数指针和结构体来实现类似于多继承的效果。 首先,理解多继承在C++中的含义:一个类可以从多个基类继承,从而获得多个基类的特性。在...
9. **《C++ Primer》要点总结(1).pdf**:这本书的摘要提供了C++核心概念的概述,包括类、对象、继承、多态等面向对象编程的关键概念,是深入学习C++的理论依据。 通过这些项目和练习,初学者不仅能学习到C语言和C++...
"C语言模式实现C++继承和多态的实例代码" 本篇文章主要介绍了C语言模式实现C++继承和多态的实例代码...在C语言中,我们可以使用struct和函数指针来模拟C++中的继承和多态,虽然实现方式不同,但是可以达到相同的效果。
在实现这个项目时,开发者需要具备扎实的C++基础知识,了解如何创建类、对象、继承、多态等面向对象编程概念,同时还要掌握C++的异常处理和内存管理。此外,对操作系统原理的理解,特别是进程和线程的概念,也是必不...
而在C语言中,虽然可以通过结构体(struct)和指针来模拟类的行为,但不具备真正的面向对象特性。 2. **数据类型**:C++扩展了C语言的数据类型,如string用于处理文本字符串,vector和list等容器类提供了动态数组和...
但是,C++中的“C+”部分引入了一些C语言不具备的新特性,比如前面提到的类、引用等。 学习C语言和C++时,理解基本概念至关重要。C语言对于初学者来说相对容易入门,因为它的概念和设计方法较为直观。而C++则需要更...
C++在C语言的基础上引入了面向对象编程(OOP)的概念,比如封装、继承和多态等,提供了更多的抽象机制和程序设计范式。C++的推出不仅极大地丰富了C语言的功能,同时也推动了软件开发方法的进步。 接下来,我们详细...
在C语言模拟的多态环境中,通过虚函数表和虚函数指针实现晚绑定。在函数调用时,通过虚函数指针间接访问虚函数表,并根据对象的实际类型调用相应的函数。 7. 使用虚函数的例子 文档提到了使用虚函数的例子,这些...
在C++中,封装、继承和多态是面向对象编程(OOP)的三大核心特性。然而,C语言作为一门不直接支持面向对象特性的语言,实现这些概念需要利用其强大的底层机制。以下是对这些概念的详细解释以及如何在C语言中模拟实现...
在上一个继承、派生实验基础上进行扩展优化设计,扩展该程序为一个狼吃羊,羊吃草模拟,所有大灰狼和小绵羊都在青青草原中生活,大灰狼吃小绵羊,羊吃草。设计成为虚函数,在之前的基础上优化捕食等虚函数,捕食的...