在非面向对象的语言中,如何进行继承?

27 浏览
0 Comments

在非面向对象的语言中,如何进行继承?

据我了解,早期的C++“编译器”实际上是将C++代码转换为C语言,并在后端使用C编译器。这让我产生了疑问。我对大部分这种工作方式的技术知识都有所了解,但我无法想象如何在没有语言支持的情况下实现类继承。

具体来说,如何定义一个具有几个字段的类,然后有一堆子类继承它,并分别添加自己的新字段,并能够在函数参数中互相传递?尤其是在C++允许在堆栈上分配对象的情况下,你甚至可能没有指针可以隐藏在背后,这该如何实现?

注意:我之前得到的几个答案都是关于多态性的。我对多态性和虚方法都非常了解。我甚至曾经在一个会议上做过关于Delphi虚方法表的底层细节的演讲。我想知道的是类继承和字段,而不是多态性。

0
0 Comments

在非面向对象的语言中如何实现继承?

在C语言中,你可以像C++的早期版本cfront一样进行继承,当C++代码被转换成C代码时,你需要非常规范地手动完成所有的工作。

你的“类”需要使用一个执行构造函数工作的函数进行初始化。这将包括初始化指向虚函数表的指针的工作。虚函数调用必须通过vtbl函数指针进行(该指针将指向一个包含每个虚函数的函数指针的结构)。

每个派生类的虚函数结构需要是基类的超集。这可能会隐藏/辅助使用宏的某些机制。

Miro Samek的第一版《Practical Statecharts in C/C++》附录A-“C+ - Object Oriented Programming in C”中有这样的宏。看起来第二版中删除了这个附录。可能是因为这比它的价值更麻烦。如果你想要这样做,只需使用C++就可以了...

你还应该阅读Lippman的《Inside the C++ Object Model》,其中详细介绍了C++在幕后的工作原理,通常包含一些在C中的工作方式的片段。

我想我明白你想要的是什么。也许。

这样的代码如何工作:

typedef

struct foo {

int a;

} foo;

void doSomething( foo f); //注意:f是按值传递的

typedef

struct bar {

foo base;

int b;

} bar;

int main() {

bar b = { { 1 }, 2};

doSomething( b); // 编译器如何知道要将b“切割”为foo?

return 0;

}

没有语言的支持,你不能这样简单地做到这一点-你需要手动完成一些事情(这就是没有语言支持的意思):

doSomething( b.base); //这样可以工作

好的回答,但这不是我问的。

0
0 Comments

在非面向对象的语言中,如何实现继承?

COM(Component Object Model)是一种在C语言中实现继承的方式。每个“类”的成员变量实际上是一个结构体。方法则是普通的函数。通过预处理器来实现C代码的伪装,使其看起来像C++代码。

具体实现如下:

struct Shape
{
  int value;
};
struct Square
{
  struct Shape shape; // 确保这个在最上面,否则会出错
  int someothervalue;
};
void Draw(Shape * shape, int x, int y)
{
  shape->value = 10;
}
Square * square;
square->Draw(0, 0); // 这样的语法并不正确,预处理器会将其转换为 Draw(square, 0, 0);

在COM中,使用类似的方式来声明DirectX COM对象。这种方式通过结构体和函数的组合,实现了继承的效果。

0
0 Comments

在非面向对象的语言中如何实现继承?

在非面向对象的语言中,可以通过使用结构体嵌套来实现继承。具体的做法是在派生结构体中嵌套一个基础结构体,并将基础结构体的实例作为派生结构体的成员之一。例如,可以定义一个基础结构体Base和一个派生结构体Derived,其中Derived结构体内部嵌套了一个Base结构体的实例。

当需要将Derived指针强制转换为Base指针时,实际上是返回Derived结构体中的__base元素的指针。在上述示例中,__base元素是结构体的第一个元素,因此指针应该是相同的(对于多继承的情况则不成立)。如果想要访问blah变量,可以使用derived.__base.blah的方式。

在非面向对象的语言中,虚函数通常通过一个特殊的函数指针表来实现,该表是每个对象的一部分,用于记录"我的类型"。这种方式可以看作是一种基本的虚函数实现方式。

通过以上的解释,我们可以理解一些C++中涉及继承层次的一些问题。这种结构体嵌套的方式可以在非面向对象的语言中实现继承的功能。

0