c++ - 调用重写虚方法的派生类调用父类方法调用了错误的方法

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

首先,对于令人困惑的标题感到抱歉。我不知道如何正确表达。

问题不是真正的问题,而是我不知道如何实现的问题。

代码如下:

#include <iostream>

class Parent
{
public:
    virtual void foo()
    {
        std::cout << "Parent's foo" << std::endl;
    }
    void bar()
    {
        foo();
    }
};

class Child : public Parent
{
public:
    void foo()
    {
        std::cout << "Child's foo" << std::endl;
    }
};

int main()
{
    Child c;

    c.bar();

    return 0;
}

当上面的代码运行时,它会打印出Child's foo

但是相同的代码,但是子类 foo 定义为 void foo(bool def = true) 打印出 Parent's foo

如果定义不匹配,是否可以调用子版本的 foo 而不是父版本?

最佳答案

不幸的是,如果你想添加额外的参数,甚至是默认参数,你可以显式地创建一个重载函数,它在大多数情况下与调用者的行为相似。

#include <iostream>
class Parent
{
public:
    virtual void foo()
    {
        std::cout << "Parent's foo" << std::endl;
    }
    void bar()
    {
        foo();
    }
};

class Child : public Parent
{
public:
    virtual void foo(bool def) // virtual if another subclass needs to override
    {
        std::cout << "Child's foo def = " << def << std::endl;
    }
    virtual void foo()override //override and virtual optional here
    {
        foo(true);
    }
};

int main()
{
    Child c;

    c.bar();
    c.foo();
    c.foo(true);

    return 0;
}

关于c++ - 调用重写虚方法的派生类调用父类方法调用了错误的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52558021/

相关文章:

c++ - 如何在不向下转型的情况下调用派生类的成员函数

android - 如何覆盖/修改 sdk 中的值或方法?

java - 替换/重写 Java "native"类?

c++ - String-Interning 使用哪个容器

c++ - 从成员指针获取指向封闭实例的指针

c++ - Qt 中许多 Windows 函数的未解决链接器错误

c++ - 功能不同?

c++ - 棘手的回调实现(C++)

iphone - iPhone 是否有一个可以使用 HMAC-SHA-1 编码的库

signature - Perl6;多子