你如何用非OO语言进行继承?

Mas*_*ler 2 c c++ oop inheritance history

我读到早期的C++"编译器"实际上将C++代码翻译成C并在后端使用了C编译器,这让我很奇怪.我已经掌握了足够的技术知识来解决大部分工作原理,但我无法弄清楚如何在没有语言支持的情况下进行类继承.

具体来说,如何定义一个包含几个字段的类,然后是一堆继承自它的子类,每个子类都添加自己的新字段,并能够作为函数参数交替传递它们?特别是当C++允许你在堆栈上分配对象时,你怎么能这样做呢?所以你甚至可能没有指向隐藏的指针?

注意:我得到的前几个答案是关于多态性的.我知道关于多态和虚方法的一切.我甚至曾经做过一次关于Delphi中虚拟方法表如何工作的低级细节的会议演示.我想知道的是类继承和字段,而不是多态.

Mic*_*urr 5

无论如何,在C语言中,当C++代码被翻译成C语言时,你可以像cfront那样用它来做这件事.但是你需要非常自律,并且手动完成所有繁琐的工作.

您的"类"必须使用执行构造函数工作的函数进行初始化.这将包括初始化指向虚函数的多态函数指针表的指针.虚函数调用必须通过vtbl函数指针(它将指向函数指针的结构 - 每个虚函数一个).

每个派生的calss的虚函数结构需要是基类的一个超集.

可以使用宏隐藏/辅助一些这样的机制.

Miro Samek的第一版"C/C++中的实用状态图"有一个附录A - "C + - 面向对象的C编程",它有这样的宏.看起来这是从第二版中删除的.可能是因为它比它的价值更麻烦.如果你想这样做,只需使用C++ ......

您还应该阅读Lippman的"Inside the C++ Object Model",其中详细介绍了C++如何在幕后工作,通常还有关于C语言如何工作的片段.


我想我明白你在追求什么.也许.

这样的事情怎么会起作用:

typedef 
struct foo {
    int a;
} foo;

void doSomething( foo f);   // note: f is passed by value

typedef
struct bar {
    foo base;
    int b;
} bar;


int main() {
    bar b = { { 1 }, 2};

    doSomething( b);    // how can the compiler know to 'slice' b
                        //  down to a foo?

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

    doSomething( b.base);       // this works
Run Code Online (Sandbox Code Playgroud)


Art*_*ius 5

基本上,结构在结构内.

struct Base {
    int blah;
};

struct Derived {
    struct Base __base;
    int foo;
};
Run Code Online (Sandbox Code Playgroud)

当你想要,比如说,转换Derived *Base *,你实际上会返回一个指向__baseDerived结构元素的指针,在这种情况下,它是结构中的第一个东西,所以指针应该是相同的(不会是虽然多个继承类的情况.

如果你想blah在这种情况下访问,你会做类似的事情derived.__base.blah.

虚函数通常使用一个特殊的函数指针表来完成,这些函数指针是每个对象的一部分,是一种基本的"我的类型是什么"记录.