如何用C语言实现面向对象

如何用C语言实现面向对象,第1张

可以通过以下方法实现面向对象:

1、封装

封装就是把数据和方法打包到一个类里面。其实C语言编程者应该都已经接触过了,C 标准库 中的 fopen(), fclose(), fread(), fwrite()等函数的 *** 作对象就是 FILE。

数据内容就是 FILE,数据的读写 *** 作就是 fread()、fwrite(),fopen() 类比于构造函数,fclose() 就是析构函数。

2、继承

继承就是基于现有的一个类去定义一个新类,这样有助于重用代码,更好的组织代码。在 C 语言里面,去实现单继承也非常简单,只要把基类放到继承类的第一个数据成员的位置就行了。

例如,我们现在要创建一个 Rectangle 类,我们只要继承 Shape 类已经存在的属性和 *** 作,再添加不同于 Shape 的属性和 *** 作到 Rectangle 中。

3、多态 C++

语言实现多态就是使用虚函数。在 C 语言里面,也可以实现多态。 现在,我们又要增加一个圆形,并且在 Shape 要扩展功能,我们要增加 area() 和 draw() 函数。

但是 Shape 相当于抽象类,不知道怎么去计算自己的面积,更不知道怎么去画出来自己。而且,矩形和圆形的面积计算方式和几何图像也是不一样的。

4、虚表和虚指针

虚表(Virtual Table)是这个类所有虚函数的函数指针的集合。

虚指针(Virtual Pointer)是一个指向虚表的指针。这个虚指针必须存在于每个对象实例中,会被所有子类继承。

5、在构造函数中设置vptr

在每一个对象实例中,vptr 必须被初枣唯派始化山亩指向其 vtbl。最好的初始化位置就是在类的构造函数中。

事实上,在构造函数中,C++ 编译器隐式的创建了一个初始化的vptr。在 C 语言里面, 我们必须显示的初始化vptr。下面就展示一下,在 Shape 的构造函数里面,如何去初始化这个 vptr。凳贺

class CCar

{

public:

CCar()

{

strBrand = ""

strType = ""

nDisplacement = 0

strColor = ""

}

CCar(const string &brand, const string &type, int displacement, const string &color)

{

strBrand = brand

strType = type

nDisplacement = displacement

strColor = color

}

CCar(const CCar &car)

{

strBrand = car.strBrand

strType = car.strType

nDisplacement = 兄尺car.nDisplacement

strColor = car.strColor

}

CCar &operator=(const CCar &car)

{

strBrand = car.strBrand

strType = car.strType

nDisplacement = 羡晌高car.nDisplacement

strColor = car.strColor

return *this

}

friend ostream &operator<<(ostream &o, const CCar &car)

{

o << "品牌:" << car.strBrand << endl

o << "类型:" << car.strType << endl

o << "排量:" << car.nDisplacement << endl

o << "颜色:" << car.strColor << endl

return o

}

friend istream &operator>>(istream &i, CCar &car)

{

cout << "输入品牌:"

i >> car.strBrand

cout << "输入类型:"

i >> car.strType

cout << "输入排量:"谨判

i >> car.nDisplacement

cout << "输入颜色:"

i >> car.strColor

return i

}

bool operator==(const CCar &car)

{

return nDisplacement == car.nDisplacement

}

bool operator<(const CCar &car)

{

return nDisplacement < car.nDisplacement

}

bool operator>(const CCar &car)

{

return nDisplacement > car.nDisplacement

}

private:

string strBrand

string strType

int nDisplacement

string strColor

}

int main()

{

CCar car_1

CCar car_2("宝马", "轿车", 1000, "白色")

car_1 = car_2

CCar car_3(car_1)

CCar car_4

cin >> car_4

cout << car_4

if (car_1 == car_2)

{

cout << "相等\n"

}

if (car_4 > car_3)

{

cout << "大于\n"

}

if (car_4 < car_1)

{

cout << "小于\n"

}

system("pause")

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8258756.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存