这可能是一个很难回答的问题,很抱歉。我最近遇到了一个奇怪的问题,当我试图在C++中处理一些高级的东西时,函数重载和继承。
我将展示一个简单的例子,只是为了演示问题;
有两个类,classA
和classB
,如下所示;
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,我知道我可以利用这样的东西。
虽然我已经找到了这条线索,它询问了一个类似的问题,但我认为这两个案例是不同的。
这个问题的答案就很好地解释了:
为什么我要使用“using”关键字访问我的基类方法?
简而言之,当编译器在当前类中找到匹配的方法名称时,即使该方法不兼容,也会停止从父类类中搜索匹配的方法。我猜这允许一些自动类型转换更符合逻辑地工作,而不需要重写那么多父类方法。
您所需要的只是使用:
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 基