【问题标题】:How does C++ OOP works?C++ OOP 是如何工作的?
【发布时间】:2018-02-16 19:36:05
【问题描述】:

所以我在玩 C++ 特性,发现 C 风格的函数指针和 C++ 方法之间有很大的不同。这是我的意思:

typedef struct _myStruct {
    void (*myFunctionOne)();
    void(*myFunctionTwo)();
    void(*myFunctionThree)();
} myStruct;

大小为 3 * 4 = 12 字节。

typedef struct _emptyStruct {
} emptyStruct;

大小为 1 个字节。

class myClass {
     void myMethodOne();
     void myMethodTwo();
     void myMethodThree();
};

大小为 1 字节,就像这是一个空结构体。

为什么是空的?如果 C++ 方法不是函数指针,它们是如何实现的?如果没有任何指针,类如何“知道”它的方法?这个问题实际上并没有让我很困扰,但它引起了我的好奇心。

【问题讨论】:

  • 成员函数的工作方式与常规的旧免费函数相同。您也不需要函数指针来调用它们。
  • 非虚拟成员函数只是作用域中的函数——实例中没有指针。虚函数也不会有实例中每个函数的指针,只有一个 vtable 指针。
  • 这是一个主题。你最好得到一个nice C++ book 来解释 C++ 的整个方面
  • 在不相关的注释中,_myStruct 结构的大小不能保证为 12 字节。它可以更多(或更少,尽管可能性不大)。
  • 尝试将方法声明为虚拟方法并再次运行测试。

标签: c++ oop ram


【解决方案1】:

在带有函数指针的结构中,每个指针都是一个成员变量。 C++ 类没有任何成员变量,正如你所说,它是 empty

成员函数与成员变量不同。

【讨论】:

    【解决方案2】:

    成员函数是函数。它们被实现为函数。它们不是数据,也不存储在结构内。它们只是在此处声明

    如果你有

    class myClass {
         void myMethodOne();
         void myMethodTwo();
         void myMethodThree();
    };
    

    然后是另一个类

    class myOtherClass {
         void myMethodOne();
         void myMethodFortyTwo();
    };
    

    那么 myMethodOne 来自 myClassmyOtherClass 不会冲突,因为它们实际上有不同的名称:myClass::myMethodOnemyOtherClass::myMethodOne

    myClass myVar;
    myVar.myMethodOne();
    

    这知道调用myClass::myMethodOne 而不是myOtherClass::myMethodOne,因为myVar类型。是myClass,所以调用了myClass的方法。

    虚拟函数的工作方式不同:它们存储在每个对象中,尽管通常是间接的(通常作为指向一大堆函数指针的指针),这样每个对象的大小就不会增长随着我们添加更多的虚函数。

    【讨论】:

    • 我会更改“虚拟函数存储在每个对象中”的措辞。这是非常具有误导性的,特别是因为您在之后立即继续描述正确的实现(指向 vtable 的指针)。
    • @GonenI 只要符合标准,任何实现都是正确的。 Vtables 是一种实现,还有其他实现。
    猜你喜欢
    • 1970-01-01
    • 2017-12-10
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多