功能不同吗?

时间:2018-11-13 16:02:24

标签: c++ override signature virtual-functions default-arguments

这是代码示例。任务是给出将输出此代码的输出。有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");
}

无法真正找到有关此案例的信息。如果您已经看到这种情况,您的伴侣可以解释一下还是提供指向某些来源的链接?

1 个答案:

答案 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将是一个好的开始。 :)