gpt4 book ai didi

c++ - 为什么使用虚拟表而不是函数指针?

转载 作者:太空狗 更新时间:2023-10-29 20:41:12 26 4
gpt4 key购买 nike

我是C++初学者,不明白为什么C++用虚表来实现多态,而不是简单的函数指针。

让我们考虑一个例子:

struct Shape {
virtual double area() = 0;
};

struct Square: public Shape {
virtual double area();
/* ... */
};

struct Circle: public Shape {
virtual double area();
/* ... */
};

double f(Shape &s) { return 42.0 + s.area(); }

C++ 通常(总是?)如何实现多态性:Shape 并且每个派生类都将指向虚拟表的隐藏指针作为第一个元素。调用s.area()时,从s的虚表中取出对应area函数的指针。

但是如果我不懂C++和虚表,想用C实现这样的多态,我会这样做:

struct Shape {
double (*area)(struct Shape *this);
};

struct Square { /* is a Shape */
double (*area)(struct Square *this);
/* ... */
};

struct Circle { /* is a Shape */
double (*area)(struct Circle *this);
/* ... */
};

double f(struct Shape *s) { return 42.0 + s->area(s); }

double cirlce_area(struct Circle *this);
double square_area(struct Square *this);

/* ... */

struct Circle c = { &circle_area, ... };
printf("%f", f((struct Shape *)c));

当调用 s->area() 时,使用 s 结构中的第一个指针。

为什么C++使用虚表而不是仅仅把指向虚函数的指针放在结构的开头(顺序相同)?我目前找不到最后一种方法可能不起作用的任何原因。

最佳答案

从概念上讲,这是完全相同的事情。

虚方法表只不过是一个函数指针列表。它没有集成在对象本身中,因为它对于对象的类是静态的,所以它可以在同一类的实例之间共享(在对象整个生命周期中节省初始化期间的计算能力和内存)。

特别是在 C++ 中,每个构造函数都将虚拟方法表指针设置为它所属类的指针。因此,在最外层的构造函数运行之后,虚方法解析为对象所属的类。

关于c++ - 为什么使用虚拟表而不是函数指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22282824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com