c++ - 功能不同?

标签 c++ overriding signature virtual-functions default-arguments

这是代码示例。任务是提供此代码将打印出的输出。它是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/

相关文章:

java - 签署 SOAP 消息时出错

c++ - visual studio 中的 __OPTIMIZE__ 是什么

c++ - 如何在 GCC 中链接 libc 和 libstdc++ 的调试版本?

css - Bootstrap 没有覆盖我自己的 css

Java 用异常处理覆盖 compareTo

swift - 覆盖 Swift 子类中的属性

c++ - 模板和字符串流的问题

c++ - Windows 进程和 WSL Linux 进程之间的共享内存

ruby - 在 Ruby 中生成 Paypal 签名, 'X-PAYPAL-AUTHORIZATION'

c# - 如何自行生成证书 SHA-256?