Mas*_*ler 2 c c++ oop inheritance history
我读到早期的C++"编译器"实际上将C++代码翻译成C并在后端使用了C编译器,这让我很奇怪.我已经掌握了足够的技术知识来解决大部分工作原理,但我无法弄清楚如何在没有语言支持的情况下进行类继承.
具体来说,如何定义一个包含几个字段的类,然后是一堆继承自它的子类,每个子类都添加自己的新字段,并能够作为函数参数交替传递它们?特别是当C++允许你在堆栈上分配对象时,你怎么能这样做呢?所以你甚至可能没有指向隐藏的指针?
注意:我得到的前几个答案是关于多态性的.我知道关于多态和虚方法的一切.我甚至曾经做过一次关于Delphi中虚拟方法表如何工作的低级细节的会议演示.我想知道的是类继承和字段,而不是多态.
无论如何,在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)
基本上,结构在结构内.
struct Base {
int blah;
};
struct Derived {
struct Base __base;
int foo;
};
Run Code Online (Sandbox Code Playgroud)
当你想要,比如说,转换Derived *为Base *,你实际上会返回一个指向__baseDerived结构元素的指针,在这种情况下,它是结构中的第一个东西,所以指针应该是相同的(不会是虽然多个继承类的情况.
如果你想blah在这种情况下访问,你会做类似的事情derived.__base.blah.
虚函数通常使用一个特殊的函数指针表来完成,这些函数指针是每个对象的一部分,是一种基本的"我的类型是什么"记录.