草庐IT

overriding

全部标签

c++ - C++ 中的覆盖和重载是怎么回事?

这行不通:classFoo{public:virtualintA(int);virtualintA(int,int);};classBar:publicFoo{public:virtualintA(int);};Barb;intmain(){b.A(0,0);}似乎通过用Bar::A(int)覆盖Foo::A(int)我以某种方式隐藏了Foo::A(int,int)。如果我添加Bar::A(int,int)一切正常。有没有人有一个链接,可以很好地描述这里发生的事情? 最佳答案 本质上,名称查找发生在重载解析之前,因此派生类中的函数A

C++ 在基类本身中重写基类的抽象方法?

如果我有这样的基类:classBase{public:Base(){}virtualvoidfoo()=0;};现在,如果我从Base类派生任何类,它将必须覆盖foo()。如果我也想在foo()上为基类设置一个行为怎么办?所以那个基类有它自己的foo,最重要的是,它的每一个都必须覆盖foo?这可能吗? 最佳答案 如果你这样做:classBase{public:Base(){}virtualvoidfoo()=0;};voidBase::foo(){{cout您将获得一个抽象类,因此您将不能创建类Base的对象b并通过调用b.foo(

java - 为什么在 Java 和 C++ 中不允许隐藏虚函数/方法?

#includeclassA{public:voidk(){std::cout没有virtual它工作正常,但是当我将A的函数更改为virtual然后它说返回类型应该相同,为什么?我在Java中尝试过同样的事情:classX{publicvoidk(){System.out.println("kFromX");}}publicclassY{publicintk(){System.out.println("kFromY");return0;}}当我在子类中尝试不同的返回类型时,Java也显示错误。(我认为因为默认情况下所有实例方法默认都是虚拟的)我期待intk()应该隐藏voidk()和

c++ - 调用姐妹类 C++ 的函数

考虑以下代码:#includeclassA{public:virtualvoidf()=0;virtualvoidg()=0;};classB:virtualpublicA{public:virtualvoidf(){g();}};classC:virtualpublicA{public:virtualvoidg(){std::coutf();}以下程序的输出是C::g。编译器如何调用B类的姊妹类的函数?? 最佳答案 N333710.3/9[Note:Theinterpretationofthecallofavirtualfunct

c++ - 需要覆盖逆变变通方法

我很难找到(我确信这是一种非常常见的)设计模式来解决以下问题。考虑这段代码:classAA{};classBB:publicAA{};classA{public:virtualvoidfoo(AA&aa)=0;};classB:A{public:voidfoo(BB&bb){cout这段代码不会编译,因为类B没有覆盖纯虚函数“foo”。编译器仅将B声明的foo视为对foo的重载,因为重写函数的输入参数中不允许协变。现在,我明白了其中的原因。B继承自A的事实意味着它应该能够处理任何带有AA类型参数的foo调用,而之前的代码没有给出处理除BB之外的任何参数类型的实现。当然,我可以在B的fo

c++ - 覆盖和最终的编译器要求

我记得在讨论最终导致新的上下文关键字override和final的通用属性时,有人建议编译器对这些矿石的支持可能是可选的(我猜它会在标准文本中读作“行为是特定于实现的”)。但我在FDIS和之后的更正中找不到任何关于这种可选性的痕迹。但既然没有找到它不是证据,我不得不问:是否支持如FDIS的2.11p2、9.2和10.3中所述override和final是符合标准的编译器所必需的吗?例如是否要求符合标准的编译器拒绝classFoo{voidfunc()override;//Error:notvirtual,9.2p9};还是通过忽略覆盖仍然符合要求? 最佳答案

c++ - 对虚重载函数感到困惑

这个问题在这里已经有了答案:Functionwithsamenamebutdifferentsignatureinderivedclass(2个答案)关闭7年前。我对以下代码的编译器错误感到困惑:classBase{public:virtual~Base(){}virtualvoidfunc(){}virtualvoidfunc(int){}virtualvoidanother(){}virtualvoidanother(int){}};classDerived:publicBase{public:voidfunc(){}};intmain(){Derivedd;d.func();d.

c++ - 在继承 : Can I override base class data members?

假设我有如下两个类:ClassA{public:..private:intlength;}ClassB:publicClassA{public:..private:floatlength;}我想知道的是:是否允许覆盖基类数据成员?如果是,这是一种好的做法吗?如果不是,扩展类数据成员类型的最佳方法是什么?有一个类满足了我的需求,我想重用它。但是为了我的程序需要,它的数据成员应该是另一种类型。我有一些书,但它们都只涉及重写基类成员方法。 最佳答案 您可以使用模板化成员,即通用成员,而不是覆盖成员。您还可以声明一个类似union的VARI

c++ - 从抽象基类 : does override specifier have any meaning? 实现纯虚函数

背景我刚刚偶然发现了overridespecifier的一个用例据我所知,这似乎是多余的,也没有任何特定的语义含义,但也许我遗漏了一些东西,因此出现了这个问题。在继续之前,我应该指出我已经尝试在SO上找到它的答案,但我得到的最近的是以下线程,并没有真正回答我的查询(也许有人可以指出实际上已经回答了我的问答问题)。C++Virtual/PureVirtualExplainedC++overridepurevirtualmethodwithpurevirtualmethod问题考虑以下抽象类:structAbstract{virtual~Abstract(){};virtualvoidfo

c++ - 覆盖虚拟成员函数时,为什么覆盖函数总是变为虚拟?

当我这样写的时候:classA{public:virtualvoidfoo()=0;}classB{public:voidfoo(){}}...B::foo()也变为虚拟的。这背后的原理是什么?我希望它的行为类似于Java中的final关键字。补充:我知道它是这样工作的,也知道vtable是如何工作的:)问题是,为什么C++标准委员会没有留下直接调用B::foo()并避免vtable查找的机会。 最佳答案 标准确实留下了直接调用B::foo并避免表查找的机会:#includeclassA{public:virtualvoidfoo(