我们有两个班级。
class A{
public:
void fun(){
cout<<"Parent\n";
}
};
class B:public A{
public:
void fun(){
cout<<"Child\n";
}
};
我试图弄清楚函数 fun()
是否会被视为重载
或覆盖
。我尝试使用覆盖
关键字,它说该方法未被覆盖。但我想知道 override
关键字是否仅在父类中的函数被编写为虚拟
函数时才有效,并且在上述情况下是否可以将该函数视为被覆盖。
另外,我想知道重写方法是否总是意味着后期绑定/运行时多态?
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-母公司 有人能解释为什么父类方法总是从子类引用调用,即使子类具有相同的方法? 但是如果我们反向代码,即父类