use*_*ica 11
空无一人.这个事实是C++开发的最初动机,当C++被称为"C with Classes"时.你能得到的最接近的是a struct.
C中有一个旨在促进某种伪继承的特性,但它并不接近实际的面向对象的类系统.指向结构的指针可以合法地转换为指向结构的第一个成员的指针,因此您可以通过使另一个结构类型B以类型A的成员开头来"扩展"结构类型A.
例如,你可以有一个PyObject结构类型和一堆结构类型,所有开始了的PyObject成员,也就是说PyIntObject,PyDictObject等:
typedef struct {
...
} PyObject;
typedef struct {
PyObject ob_base;
// more members...
} PyIntObject;
typedef struct {
PyObject ob_base;
// more members...
} PyDictObject;
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用指针传递PyIntObjects和PyDictObjects PyObject并使用部件中的数据PyObject来说明封闭结构的类型.
正如您可能从名称中猜到的那样,我从Python中获取了这个示例,其中此机制用于在C之上实现Python的面向对象类型系统.
您可以将C ++中的“类”交换为“结构”。我并不是说您应该这样做,但一个Mans对象是具有某些功能的另一个Mans结构。显然,C ++增加了一些额外的位。C和不透明指针Objects在那方面也是非常有用的。
#include <iostream>
struct Cat {
public:
Cat(int initialAge); // constructor
~Cat(); // destructor
int GetAge();
private: // begin private section
int itsAge; // member variable
};
Cat::Cat(int initialAge) {
itsAge = initialAge;
}
int Cat::GetAge() {
return itsAge;
}
int main(void) {
Cat *cat = new Cat(1);
std::cout << "This cat declared as a struct is " << cat->GetAge() << " years old" <<std::endl;
return 1;
}
Run Code Online (Sandbox Code Playgroud)
您可以通过更多的工作在C中实现类似的功能。
#ifndef CAT_H
#define CAT_H
#include <stdlib.h>
#include <stdio.h>
typedef struct Cat Cat;
typedef struct CatOps {
int (* GetAge )();
} CatOps;
struct Cat {
void * obj;
CatOps * ops;
};
Cat * new_cat(int age);
void delete_cat(Cat * cat);
#endif /* CAT_H */
Run Code Online (Sandbox Code Playgroud)
.c文件是
#include "cat.h"
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
typedef struct cat_obj {
int age;
} cat_obj;
int get_age();
static CatOps CAT_OPS = {
.GetAge = get_age,
};
Cat * new_cat(int age) {
Cat * imp;
cat_obj * obj;
imp = malloc(sizeof(*imp));
obj = malloc(sizeof(*obj));
imp->obj = obj;
imp->ops = &CAT_OPS;
return (Cat*)imp;
}
void delete_cat(Cat *cat) {
free(cat->obj);
free(cat);
}
static void get_age(Cat *cat) {
cat_obj *c = (cat_obj*)cat->obj;
}
Run Code Online (Sandbox Code Playgroud)
注意,我还没有测试过它,但是如果您知道C / C ++,那么您应该认识这个习惯用法。