c++ - C++如何在内存中存储函数和对象?

标签 c++ function turbo-c

<分区>

假设我们有一个类

class A
{
    int x;
public:
    void sayHi()
    {
        cout<<"Hi";
    }
};

int main()
{
    A *a=NULL;
    a->sayHi();
}

以上代码将在 Turbo C(我测试过的)上编译并打印 Hi 作为输出。

我原以为会崩溃,因为 aNULL。此外,如果我将 sayHi() 函数设为虚拟函数,它会显示

Abnormal temination(Segmentation fault in gcc) 

我知道其中很多都依赖于实现,但如果有人能对任何实现有所了解或只是给出一个概述,那就太好了。

最佳答案

显然,代码有未定义的行为,即,无论你得到什么都是偶然的。也就是说,系统在调用非虚拟成员函数时不需要知道对象:它可以根据签名调用。此外,如果成员函数不需要访问成员,则它根本不需要真正需要对象并且可以运行。这是您在代码打印一些输出时观察到的。然而,这是否是系统的实现方式尚未定义,也就是说,没有任何说法表明它有效。

当调用虚函数时,类型系统开始查看与对象关联的类型信息记录。在 NULL 指针上调用虚函数时,不存在此类信息,尝试访问它可能会导致某种崩溃。尽管如此,它不是必须的,但它对大多数系统都是如此。

顺便说一句,main() 总是 返回 int

关于c++ - C++如何在内存中存储函数和对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12660829/

相关文章:

c++ - 如何让 libtorrent 看到 boost ?

c++ - 如何使用二叉索引树来计算小于索引值的元素数?

c++ - 如何检查类型是否提供具有算术类型的函数

javascript - 代码块内定义的内部函数的语义是什么?

无法在 C 中写入屏幕内存

c - 解释以下 Turbo C 代码中如何以及为何使用指针

c++使用va_arg调用父类(super class)构造函数

javascript - 在 JavaScript 中使用带有空白参数的函数

javascript - 了解 JavaScript 语法?

C 二维数组