当前位置: 首页 > 知识库问答 >
问题:

C++在继承类中函数重载问题

卫阳炎
2023-03-14

这可能是一个很难回答的问题,很抱歉。我最近遇到了一个奇怪的问题,当我试图在C++中处理一些高级的东西时,函数重载和继承。

我将展示一个简单的例子,只是为了演示问题;

有两个类,classAclassB,如下所示;

class classA{
    public:
        void func(char[]){};    
};

class classB:public classA{ 
    public:
        void func(int){};
};

据我所知,classB现在应该有两个func(..)函数,由于不同的参数而被重载。

但在main方法中尝试这一点时;

int main(){
    int a;
    char b[20];
    classB objB;
    objB.func(a);    //this one is fine
    objB.func(b);    //here's the problem!
    return 0;
}

它给出了错误,因为超类ClassA中的方法void func(char[]){};在派生类ClassB中不可见。

我怎样才能克服这些呢?在C++中重载不就是这样工作的吗?我是C++新手,但在Java,我知道我可以利用这样的东西。

虽然我已经找到了这条线索,它询问了一个类似的问题,但我认为这两个案例是不同的。

共有2个答案

壤驷向明
2023-03-14

这个问题的答案就很好地解释了:

为什么我要使用“using”关键字访问我的基类方法?

简而言之,当编译器在当前类中找到匹配的方法名称时,即使该方法不兼容,也会停止从父类类中搜索匹配的方法。我猜这允许一些自动类型转换更符合逻辑地工作,而不需要重写那么多父类方法。

楚弘益
2023-03-14

您所需要的只是使用:

class classB:public classA{ 
    public:
        using classA::func;
        void func(int){};
};

它不在基类中搜索func,因为它已经在派生类中找到了一个。using语句将另一重载带入同一作用域,以便它能够参与重载解析

 类似资料:
  • 我希望有一个结构,它接受任意数量的lambdas,并作为所有调用操作符的中心调用点。 如果使用与构造时给出的任何 lambda 不匹配的参数列表调用调用运算符,则应调用默认调用运算符。 我以为下面的代码可以完全做到这一点。每个 lambda 的调用运算符都通过使用“提升”到 类。 当我在结构中没有默认的call操作符时,一切都像预期的那样工作(使用有效的参数列表)。如果我将它添加到结构中(如上面的

  • 主要内容:多继承下的构造函数,命名冲突在前面的例子中,派生类都只有一个基类,称为 单继承(Single Inheritance)。除此之外, C++也支持 多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、 C#、 PHP 等干脆取消了多继承。 多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A

  • 默认任何类都是基础继承自Any(与java中的Object类似),但是我们可以继承其它类。所有的类默认都是不可继承的(final),所以我们只能继承那些明确声明open或者abstract的类: open class Animal(name: String) class Person(name: String, surname: String) : Animal(name) 当我们只有单个构造器时

  • C#中的override本身是否具备【重写】的定义,还是说【重写】的定义只有关键字abstract和virtual才有 多层继承后,我不知道子类override的是父类中的override方法还是基类中的abstract方法

  • 我试图重写模板类http://docs.ros.org/hydro/api/rviz/html/c/message__filter__display_8h_source.html使用多种消息类型,使用变量模板。 我的第一个问题是如何使用可变模板重写下面的示例代码,以便它可以用于任意数量的模板参数,而不仅仅是2个。 我需要在家长类: 每个模板类型的虚拟成员函数 每个模板类型的每个的成员函数 每个模板

  • 正如节点可以从其他节点继承一样,这可以为相似的节点复制很多代码, 同样的思想也可以用于类。 例如,假设你有一个管理 Apache Web 服务器的 apache 类, 你想要使用略有不同的配置文件设置一台新的 Apache 机器 — 也许是监听的端口不同。 你可以复制整个 apache 类,除了配置文件。另外,你可以从 apache 类中提取配置文件并创建两个新类,每个新类都包含 apache 基