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

该方法是否被重写或重载?

唐宇定
2023-03-14

我们有两个班级。

class A{
public:
  void fun(){
     cout<<"Parent\n";
  }
};
class B:public A{
public:
  void fun(){
     cout<<"Child\n";
  }
};

我试图弄清楚函数 fun() 是否会被视为重载覆盖。我尝试使用覆盖关键字,它说该方法未被覆盖。但我想知道 override 关键字是否仅在父类中的函数被编写为虚拟函数时才有效,并且在上述情况下是否可以将该函数视为被覆盖。

另外,我想知道重写方法是否总是意味着后期绑定/运行时多态?

共有1个答案

梁丘飞鸾
2023-03-14

B::fun既不重载也不覆盖A::fun。它隐藏了它。这不是覆盖,因为您仍然可以通过将B视为A来获取A::fun行为。

B x;
A &y = x;
y.fun(); // outputs Parent

当您尝试通过A接口访问fun方法时,您会得到 behavior。如果 A::fun声明了 虚拟,则 >将覆盖它,并且通过 方法将输出

重载和隐藏之间的区别在这里并不明显,因为参数列表是相同的,但是考虑一下层次结构

struct A {
    void foo(int i) { std::cout << i << "\n"; }
};
struct B : A {
    void foo(std::string const &s) { std::cout << std::quoted(s) << "\n"; }
};

如果< code>B::foo只是重载了< code>A::foo,那么这样就可以了

B x;
x.foo(5);

但事实并非如此。注意,x仍然有foo(int)方法。

A &y = x;
y.foo(5); // works

你只是不能通过B接口访问它。这是因为重载解析只能在同一个类中声明的一组成员之间完成。如果一个类没有声明名称的成员,那么它会进入基类,但是如果该类确实声明了名称并且没有一个匹配,解析就会失败。(即删除B::foo将使x.foo(5)工作。)

您可以使用< code>using指令请求重载,而不是隐藏语言,但是同样地,除非< code>A::fun是< code>virtual(并且< code>B::fun需要与< code>A::fun具有相同的参数列表),否则重写是不可能的。

struct B : A {
    using A::foo;
    void foo(std::string const &s) { std::cout << std::quoted(s) << "\n"; }
};

(附言关于评论,C中的技术术语确实是隐藏。阴影可能是其他语言中用于这种行为的词,但C标准使用了“隐藏”。)

 类似资料:
  • 重载子类中重写的方法,我是重载父方法还是重载子类方法? 我大体上理解什么是超载和超驰。 重载-同一方法在同一个类中有不同的参数和可能的返回类型。 重写-子类中的方法签名与父类中的方法签名相同,但实现不同。 方法B.a(INTX)是重载a.a还是重载B.a?

  • 如果我克隆了以下类的一个实例,并在实例化时覆盖了一个方法,克隆会有被覆盖的方法吗?我在https://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html和https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()中没有找到任何关于这种行为的内容。

  • 然而,我不确定我是否理解他的观点,因为根据我的理解,当我们有一个父类引用变量指向子类对象时,一个行为被认为是多态的(侧重于动态多态性)。 然后在运行时获取父类变量所指向的实际对象,并调用其方法,如这里所解释的那样。 但是,我没有在我的项目中使用上向转换(即用对象类变量初始化POJO类)。 因此,我的问题是--尽管父类(对象)从未用作引用变量,但重写toString()是否被视为多态性? 我在Sta

  • Java中方法重载和重写的区别?不能给出正确答案。下面是java代码。 问题:这个方法是重载、重写还是没有?

  • subA类是A类的子类。我试图重写一个方法,但不知怎的,它不允许我重写它。为什么会这样?是因为参数中的参数吗? 读取错误消息: 名称冲突:subA中的add(E#1)和A中的add(E#2)具有相同的擦除,但两者都不重写另一个,其中E#1、E#2是类型变量: E#1扩展了subA类中声明的对象 E#2扩展了A类中声明的对象 超类A: 子类subA:

  • 这里我有两个类DemoParent和DemoChild,它们扩展了DemoParent,在DemoParent中我有通用方法m1(int I),但在DemoChild中我有varargs方法m1(int…I)。当我创建子类的对象并调用m1方法时,它会给我父类方法输出。请参见下面的输出。o/p-母公司 有人能解释为什么父类方法总是从子类引用调用,即使子类具有相同的方法? 但是如果我们反向代码,即父类