首页 > 解决方案 > 不同的功能?

问题描述

所以这里是代码示例。任务是提供此代码将打印出来的输出。是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");
}

真的找不到在哪里阅读有关此案的信息。如果你看过这个案例,你能解释一下或给出一些来源的链接吗?

标签: c++overridingsignaturevirtual-functionsdefault-arguments

解决方案


它们已经是两个不同的函数(覆盖不会改变这一点),但是因为它们具有不同的签名,所以 in 中的一个不会B覆盖in中的那个。A

请记住,函数的名称只是其身份的一部分!它的参数列表也很重要。

如果您将override关键字放在上面,B::init()那么您的程序将无法编译,因为B::init()实际上并没有覆盖任何东西(在它的基础中没有init(), virtual 或其他)。

A::init(bool)如果这两个函数实际上具有不同的名称,例如and ,那么 vtable 就不会真正“发生”任何事情B::urgleburgleboop()

请注意,除了virtual多态性和覆盖之外,B::init()还“隐藏”A::init(bool)了正常的重载解决方案(感谢 C++!),因此 Clang 会警告您的代码。

至于你可以在哪里阅读它,你的 C++ 书将是一个好的开始。:)


推荐阅读