这是代码示例。任务是提供此代码将打印出的输出。它是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");
}
无法真正找到在哪里阅读有关此案例的信息。如果你见过这种情况,你能解释一下或提供一些来源的链接吗?
最佳答案
它们已经是两个不同的函数(重写不会改变这一点),但是因为它们有不同的签名,所以 B
中的函数不会重写A
。
请记住,函数的名称只是其身份的一部分!它的参数列表也很重要。
如果您将 override
关键字放在 B::init()
上,那么您的程序将无法编译,因为 B::init()
实际上并没有覆盖任何东西(在它的基础上没有 init()
,无论是虚拟的还是其他的)。
如果这两个函数字面上有不同的名称,如 A::init(bool)
和 B::urgleburgleboop,则 vtable 不会真正“发生”任何事情()
。
请注意,除了 virtual
和多态性和覆盖之外,B::init()
还“隐藏”了 A::init(bool)
用于正常的重载解析(感谢 C++!),因此 Clang 会在您的代码上发出警告。
至于哪里可以看到,your C++ book将是一个好的开始。 :)
关于c++ - 功能不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53284920/