Wednesday, November 4, 2009

Objects, Part 2: Inheritance and Name Mangling

As was covered in the previous post, we are dealing with how C++ classes would compile down to equivalent C code. Consider the following classes:
// C++
class Parent
{
public:
int getParentMember();
void setParentMember(int);
protected:
int parent_member;
};

class Child: public Parent
{
public:
int getChildMember();
void setChildMember(int);
private:
int childMember;
};

int Parent::getParentMember()
{
return this->parentMember;
}

void Parent::setParentMember(int p)
{
this->parentMember = p;
}

int Child::getChildMember()
{
return this->childMember;
}

void Child::setChildMember(int c)
{
this->childMember = c;
}

The Parent class' C equivalent is straightforward. Parent is really no different from any of the classes we've dealt with so far:
// C
struct Parent
{
int (*getParentMember)();
void (*setParentMember)(int);
int parentMember;
};

// Parent::Parent()
void constructor(struct Parent* this)
{
this->getParentMember = getParentMember;
this->setParentMember = setParentMember;
}

// Parent::~Parent()
void destructor(struct Parent* this)
{
}

// int Parent::getParentMember()
int getParentMember(struct Parent* this)
{
return this->parentMember;
}

void setParentMember(struct Parent* this, int p)
{
this->parentMember = p;
}

No comments:

Post a Comment