简介
继承和多态是面向对象编程语言的最强大的功能。继承和多态,我们可以实现代码重用。
有许多棘手的方式实施在C多态性
这篇文章的目的是展示一个简单,易于应用创建一个VTable C.继承和多态性技术(虚拟表),并提供适当的访问基类和派生对象之间的,我们可以实现在C的继承和多态性VTable的概念可以实现保持功能指针表。提供基类和派生对象之间的访问,我们必须保持在基类和派生类的基对象的引用的派生对象的引用。说明
在开始之前执行的继承和多态性在C,我们应该知道在C类表示在C类表示
考虑一个类??代码>的人吗?在C?//Person.h
class Person
{
private:
char* pFirstName;
char* pLastName;
public:
Person(const char* pFirstName, const char* pLastName); //constructor
Person(); //destructor
void displayInfo();
void writeToFile(const char* pFileName);
};
在C上面的类,我们可以使用结构,该结构的成员函数的功能。{C}
在这里,为结构的人定义的功能没有封装。为了实现封装,这是具有约束力的数据和函数,函数指针是用来之间。我们需要创建一个函数指针表。 new_Person()构造函数将设置值的函数指针指向相应的职能。这个函数指针表,然后作为一个对象的访问通过函数的接口。
让我们重新定义的Person类的C语言实现。//Person.h
typedef struct _Person Person;
//declaration of pointers to functions
typedef void (*fptrDisplayInfo)(Person*);
typedef void (*fptrWriteToFile)( Person*, const char*);
typedef void (*fptrDelete)( Person *) ;
//Note: In C all the members are by default public. We can achieve
//the data hiding (private members), but that method is tricky.
//For simplification of this article
// we are considering the data members //public only.
typedef struct _Person
{
char* pFName;
char* pLName;
//interface for function
fptrDisplayInfo Display;
fptrWriteToFile WriteToFile;
fptrDelete Delete;
}Person;
person* new_Person(const char* const pFirstName,
const char* const pLastName); //constructor
void delete_Person(Person* const pPersonObj); //destructor
void Person_DisplayInfo(Person* const pPersonObj);
void Person_WriteToFile(Person* const pPersonObj, const char* pFileName);
new_Person()函数作为构造函数。该函数返回新创建的实例的结构。它初始化函数指针的接口访问其他成员函数。这里有一点要注意的是,我们定义这些函数指针,这是为公众查阅。我们还没有获得在接口的私有函数。让我们看看new_Person()函数或我们的Person类的构造函数在C//Person.c
person* new_Person(const char* const pFirstName, const char* const pLastName)
{
Person* pObj = NULL;
//allocating memory
pObj = (Person*)malloc(sizeof(Person));
if (pObj == NULL)
{
return NULL;
}
pObj->pFirstName = malloc(sizeof(char)*(strlen(pFirstName)+1));
if (pObj->pFirstName == NULL)
{
return NULL;
}
strcpy(pObj->pFirstName, pFirstName);
pObj->pLastName = malloc(sizeof(char)*(strlen(pLastName)+1));
if (pObj->pLastName == NULL)
{
return NULL;
}
strcpy(pObj->pLastName, pLastName);
//Initializing interface for access to functions
pObj->Delete = delete_Person;
pObj->Display = Person_DisplayInfo;
pObj->WriteToFile = Person_WriteToFile;
return pObj;
}
创建对象后,我们可以访问其数据成员和函数。Person* pPersonObj = new_Person("Anjali", "Jaiswal");
//displaying person info
pPersonObj->Display(pPersonObj);
//writing person info in the persondata.txt file
pPersonObj->WriteToFile(pPersonObj, "persondata.txt");
//delete the person object
pPersonObj->Delete(pPersonObj);
pPersonObj = NULL;
注意:在C不同,在C中,我们不能直接在函数访问数据成员。在C中,可以直接访问数据成员,通过隐式??代码>此??指针。由于我们没有??代码>??在C指针,传递对象明确的成员函数。在C类的数据成员的访问,我们需要传递给函数的参数调用对象。在上面的例子中,我们传递作为第一个参数的函数调用对象。这样,函数可以访问对象的数据成员。在C类的代表性
Person类表示 - 检查的指向成员函数的接口的初始化:
简单的例子,继承和多态性
继承 - 从Person类的派生类Employee:
{S1}
在上面的例子中,类Employee继承Person类的属性。由于DisplayInfo()和WriteToFile()函数是虚拟的,我们可以访问Employee对象的Person实例相同的功能。对于这一点,我们需要主动与Employee类Person实例。这是可能的,因为多态性。多态性,以解决函数调用的情况下,C使得使用的vtable,这只不过是一个函数指针表。
接口功能,我们在维护结构的指针的作品类似的vtable。//Polymorphism in C++
Person PersonObj("Anjali", "Jaiswal");
Employee EmployeeObj("Gauri", "Jaiswal", "HR", "TCS", 40000);
Person* ptrPersonObj = NULL;
//preson pointer pointing to person object
ptrPersonObj = &PersonObj;
//displaying person info
ptrPersonObj ->Display();
//writing person info in the persondata.txt file
ptrPersonObj ->WriteToFile("persondata.txt");
//preson pointer pointing to employee object
ptrPersonObj = &EmployeeObj;
//displaying employee info
ptrPersonObj ->Display();
//writing empolyee info in the employeedata.txt file
ptrPersonObj ->WriteToFile("employeedata.txt");
在C语言中,继承可以实现保持在派生类对象的基类对象的引用。基类的实例的帮助下,我们可以访问的基础数据成员和函数。然而,为了实现多态性,基类对象应该能够访问派生类对象的数据。对于这一点,基类应该有访问派生类的权利??数据成员。
为了实现虚函数,派生类的签名??功能有类似的基类??函数指针。这意味着派生类的函数将作为一个参数的基类的实例。我们会继续在基类的派生类。在功能的实现,我们可以从派生类的引用访问实际派生类的数据。在C结构的等价表示
继承在C - PERSON和EMPLOYEE中的C结构:
{S2}
正如图中所示,我们已经宣布在控股派生类对象的基类结构的指针,并在派生类中持有的基类对象的结构的指针。
在基类对象,函数指针指向它自己的类的虚函数。在派生类对象的建设,我们需要使基类的接口指向派生类的成员函数。这为我们提供了灵活的调用派生类的功能,通过基类对象(多态性)。有关详细信息,检查建设Person和Employee对象。
当我们谈论关于在C多态性,有一个对象销毁的问题。对于适当的清理对象,它使用虚拟析构函数。在C中,这可以通过删除功能的基类指针指向派生类的析构函数。派生类的析构函数清理派生类的数据,以及基类的数据和对象。注:检查虚析构函数和虚函数实现的细节的示例源代码。创建Person对象