【发布时间】:2024-01-20 10:35:01
【问题描述】:
所以这里是代码示例。任务是提供此代码将打印出来的输出。是2个不同的功能吗?那么 B 类中的 vtable 会发生什么? 它是否仅在 2 个同名的不同函数上存储 2 个指针?
#include<iostream>
#include <vector>
using namespace std;
class A
{
public:
A()
{
init();
}
virtual void init(bool a = true)
{
if(a)
cout << "A" << endl;
}
};
class B :public A
{
public:
virtual void init()
{
cout << "B" << endl;
}
};
int main()
{
B b;
A* a = &b;
a->init();
a->init(true);
system("pause");
}
实在找不到在哪里阅读有关此案例的信息。如果你看过这个案例,你能解释一下或给出一些来源的链接吗?
【问题讨论】:
-
尝试在启用警告的情况下编译它 - 你应该至少会收到一个有用的警告,这会给你一些洞察力......
-
哦,clang 显然更有帮助...
<stdin>:21:18: warning: 'B::init' hides overloaded virtual function [-Woverloaded-virtual] virtual void init() ^ <stdin>:12:18: note: hidden overloaded virtual function 'A::init' declared here: different number of parameters (1 vs 0) virtual void init(bool a = true) -
这就是
override的原因。 -
您编写的每个函数都与其他函数不同。真正的问题是“当我拨打电话时,会选择哪一个?”
-
@PaulR gcc 会在您明确添加您在 clang 警告消息中显示的
-Woverloaded-virtual开关时发出警告。
标签: c++ overriding signature virtual-functions default-arguments