这是代码示例。任务是给出将输出此代码的输出。有2种不同的功能吗?那么B类中的vtable会发生什么? 它是否仅将两个指针存储在两个具有相同名称的不同函数上?
#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");
}
无法真正找到有关此案例的信息。如果您已经看到这种情况,您的伴侣可以解释一下还是提供指向某些来源的链接?
答案 0 :(得分:2)
它们已经是两个不同的函数(重写不会改变它),但是因为它们具有不同的签名,所以 AsyncResult {
result.value.recoverWith {
case _: Throwable =>
println("recovered exception")
Future.successful(Right(99))
}
}
中的一个不会 not 覆盖{{1 }}。
请记住,函数的名称只是其标识的一部分!其参数列表也很重要。
如果将B
放在A
上,则程序将无法编译,因为override
实际上并没有覆盖任何内容(没有B::init()
(以虚拟或其他方式)。
如果两个函数的字面名称不同,例如B::init()
和init()
,vtable不会真正“碰上”。
请注意,除了A::init(bool)
和多态性和重载之外,B::urgleburgleboop()
还“隐藏” virtual
以实现正常的过载解析(感谢C ++!),并且由于此Clang将警告您的代码。
关于可以在哪里阅读的内容,your C++ book将是一个好的开始。 :)