C ++有多重inheritance。 在汇编级别实现多重inheritance可能相当复杂,但是在线上有很好的介绍如何正常完成(vtables,pointer fixups,thunk等)。 Java没有多个实现inheritance,但是它有多个接口inheritance,所以我不认为每个类都有一个单独的vtable可以实现这一点。 java如何在内部实现接口? 我意识到,与C ++相反,Java是Jit编译的,所以不同的代码段可能会有不同的优化,而不同的JVM可能会做不同的事情。 那么,是否有一些JVM遵循的一般策略,或者是否有人知道特定JVM中的实现? 另外JVM经常虚拟化和内联方法调用,在这种情况下根本就没有涉及到vtable或等价物,所以询问实现虚拟/接口方法调用的实际汇编序列是没有意义的,但是我认为大多数JVM仍然保留一些如果它们没有能够虚拟化所有的东西,那么可以使用类的一般表示。 这个假设是错误的吗? 这种表示看起来像一个C ++的vtable? 如果是的话,接口是否有单独的vtables,这些如何与类vtable相关联? 如果是这样,对象实例可以有多个vtable指针(类/接口vtables),就像C ++中的对象实例一样? 类types和接口types对同一对象的引用总是具有相同的二进制值,或者它们可以不同,就像在C ++中需要指针修正一样? (仅供参考: 这个问题对CLR提出了类似的问题 ,在这篇msdn文章中似乎有一个很好的解释,尽pipe现在可能已经过时了,但我还没有find类似于Java的东西。 编辑: 我的意思是“实现”的意思是“GCC编译器如何实现整数加法/函数调用/等”,而不是“Java类ArrayList实现List接口”的含义。 我知道这是如何在JVM字节码级别上工作的,我想知道的是JVM在加载类文件和编译字节码之后生成的是什么样的代码和数据结构。
takeaway.o: In function `takeaway': project:145: undefined reference to `vtable for takeaway' project:145: undefined reference to `vtable for takeaway' takeaway.o: In function `~takeaway': project:151: undefined reference to `vtable for takeaway' project:151: undefined reference to `vtable for takeaway' takeaway.o: In function `gameCore': project.h:109: undefined reference to `gameCore<int>::initialData(int)' collect2: ld returned 1 exit status make: *** [takeaway] Error […]
这是我的标题: #ifndef BARELYSOCKET_H #define BARELYSOCKET_H #include <QObject> //! The First Draw of the BarelySocket! class BarelySocket: public QObject { Q_OBJECT public: BarelySocket(); public slots: void sendMessage(Message aMessage); signals: void reciveMessage(Message aMessage); private: // QVector<Message> reciveMessages; }; #endif // BARELYSOCKET_H 这是我的class级: #include <QTGui> #include <QObject> #include "type.h" #include "client.h" #include "server.h" #include "barelysocket.h" BarelySocket::BarelySocket() { //this->reciveMessages.clear(); […]
对于这个代码: class B1{ public: virtual void f1() {} }; class D : public B1 { public: void f1() {} }; int main () { B1 *b1 = new B1(); D *d = new D(); return 0; } 编译之后,我用g++ -fdump-class-hierarchy获得的vtable是: Vtable for B1 B1::_ZTV2B1: 3u entries 0 (int (*)(…))0 8 (int (*)(…))(& _ZTI2B1) 16 B1::f1 Vtable […]
我们都知道C ++中的虚函数是什么,但是它们是如何实现的呢? vtable可以修改,甚至可以直接在运行时访问吗? 这个vtable是否存在于所有的类,或者只有那些至less有一个虚函数的类? 抽象类是否至less有一个条目的函数指针是NULL? 单个虚拟function是否会减慢整个class级的速度? 或者只有对虚拟函数的调用? 如果虚拟函数被实际覆盖,速度会受到影响,或者只要虚拟函数没有效果,速度会受到影响。
我在Windows 7 Ultimate 32位上使用Qt Creator 2.0.1和Qt 4.7.0(32位)。 考虑下面的代码,这是产生错误的最小值: class T : public QObject, public QGraphicsItem { Q_OBJECT public: T() {} QRectF boundingRect() const {return QRectF();} void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {} }; int main() { T t; return 0; } 上面的代码片段导致以下链接器错误: 在函数“T”中: 未定义的引用'vtable for T' 未定义的引用'vtable for T' 在函数'〜T'中: 未定义的引用'vtable for T' […]
几乎最后一步,但仍然有一些奇怪的erros …. bash-3.2$ make g++ -Wall -c -g Myworld.cc g++ -Wall -g solvePlanningProblem.o Position.o AStarNode.o PRM.o PRMNode.o World.o SingleCircleWorld.o Myworld.o RECTANGLE.o CIRCLE.o -o solvePlanningProblem Undefined symbols: "vtable for Obstacle", referenced from: Obstacle::Obstacle()in Myworld.o "typeinfo for Obstacle", referenced from: typeinfo for RECTANGLEin RECTANGLE.o typeinfo for CIRCLEin CIRCLE.o ld: symbol(s) not found collect2: ld returned 1 exit […]
C ++通过虚拟机制支持dynamic绑定。 但据我所知,虚拟机制是编译器的实现细节,标准只是指定了在特定场景下应该发生的行为。 大多数编译器通过虚拟表和虚拟指针来实现虚拟机制。 是的,我知道这是如何工作的,所以我的问题不是关于虚拟指针和表的实现细节。 我的问题是: 除虚拟指针和虚拟表机制之外,是否有任何其他方式实现虚拟机制的编译器? 据我所见(阅读g ++,Microsoft Visual Studio)通过虚拟表,指针机制来实现它。 那么实际上是否还有其他编译器实现呢? 任何具有虚函数的类的sizeof将是该编译器中的一个指针(vptr)的大小。因此,假设虚拟ptr和tbl机制本身就是编译器实现,那么我上面所做的这个陈述总是正确的吗?