我最近观看了来自 “Low Level Learning” 的 YouTube 视频,其中在
03:38
中提到“默认情况下,派生类中具有相同签名的函数在父类中是虚拟的。”我不确定我是否误解了,但这似乎暗示当派生类具有与父类中的方法具有相同签名的方法时,父类中的方法将变为虚拟,即使 virtual
关键字不是明确使用。
关于此声明,我心中形成了几个问题:
该说法属实吗?在派生类中具有相同签名的函数是否会使它们在父类中自动成为虚拟函数?
此外,在基类上使用
sizeof()
来确定父派生类是否使用 vtable 是否有效?
为了验证我对此的理解,我用 C++ 创建了以下程序:
#include <iostream>
struct Base {
int num;
Base(int num) : num(num) {}
void greet() {
std::cout << "Hello " << num << " from Base Class\n";
}
float operator()(int n) const { return n * num; }
};
struct Derived : public Base {
float num;
Derived(float num) : Base(1), num(num) {}
void greet() {
std::cout << "Hello " << num << " from Derived Class\n";
}
float operator()(int n) const { return n * num; }
};
int main() {
Base base(5);
Derived derived(8.8);
base.greet();
derived.greet();
std::cout << "sizeof(base) = " << sizeof(base) << "\n";
std::cout << "sizeof(derived) = " << sizeof(derived) << "\n";
std::cout << "base(3) = " << base(3) << "\n";
std::cout << "derived(3) = " << derived(3) << "\n";
return 0;
}
根据我的理解,如果一个类使用了 vtable,与没有 vtable 的类相比,它应该会产生不同的预期
sizeof()
值。然而,在我的程序中,大小保持不变,而将一些父类方法声明为 virtual 确实增加了大小。
我希望对这些问题进行澄清和解释。谢谢!
该说法属实吗?在派生类中具有相同签名的函数是否会使它们在父类中自动成为虚拟函数?
不,这是假的。
此外,在基类上使用 sizeof() 来确定父派生类是否使用 vtable 是否有效?
sizeof
不反映任何称为“vtable”的东西,或者与它有任何关系。不仅如此,在构成当前 C++ 标准的两千页中,您找不到任何提及任何被描述为“vtable”的内容。
如果你回顾一下我在 Stackoverflow 上的发帖历史,你会发现我反复说过这样的话:任何小丑都可以将视频上传到 Youtube,或者在某些博客上发布随机的、漫无目的的幻觉。就连我也能做到。我做到了。
如果您的目标是学习 C++,那么通过随机观看视频或尝试做随机编码谜题是不会成功的。学习当今使用的最复杂、最难学习的通用编程语言的唯一经过时间考验、行之有效的方法是来自一本好的、有信誉的教科书。出版一本教科书需要资金,没有哪个出版商会冒着在死树上失去大量变化的风险,而不彻底审查源材料。上传的 Youtube 视频或发布网站没有太多的审查过程。