想象一下这个简单的基类:structsimple_http_service{virtualreplyhttp_get(…);virtualreplyhttp_post(…);virtualreplyhttp_delete(…);//etc.};我想阻止用户从此类派生而不覆盖至少其中一个,并阻止他们实例化simple_http_service有什么好的方法可以做到这一点吗? 最佳答案 这听起来像是一个非常奇怪的约束。一定要保护用户免受不正确的使用,但不要试图禁止您只是“看不到重点”的事情。如果在不覆盖这三个函数中的任何一个的情况下从你
因此,我正在为一个类编写代码,该类将进入一个供其他人使用的库。此类将拦截和处理传入的消息(细节并不重要,但它使用activemq-cpp库)。这个消费类的轮廓是classMessageConsumer{...public:voidrunConsumer();virtualvoidonMessage(constMessage*message);}其中runConsumer()建立连接并开始监听,并在收到消息时调用onMessage()。我的问题是:使用此代码的人将各自有自己的方式来处理不同的消息。我怎样才能保持MessageConsumer通用但提供这种灵active,同时保持代码简单?
有时我在重写方法时不小心忘记在C++中调用父类(superclass)的方法。有什么方法可以帮助我确定何时重写方法,这样我就不会忘记调用父类(superclass)的方法吗?(类似于Java的@Override,除了C++没有注解...) 最佳答案 一个建议是Non-VirtualInferfaceIdiom.即,使您的公共(public)方法成为非虚拟方法,并让它们调用派生类可以覆盖的私有(private)或protected虚拟方法,以实现它们的特定行为。如果您无法控制基类,您或许可以使用中间类:classFoo//Don'tc
这行不通: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
如果我有这样的基类:classBase{public:Base(){}virtualvoidfoo()=0;};现在,如果我从Base类派生任何类,它将必须覆盖foo()。如果我也想在foo()上为基类设置一个行为怎么办?所以那个基类有它自己的foo,最重要的是,它的每一个都必须覆盖foo?这可能吗? 最佳答案 如果你这样做:classBase{public:Base(){}virtualvoidfoo()=0;};voidBase::foo(){{cout您将获得一个抽象类,因此您将不能创建类Base的对象b并通过调用b.foo(
#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()和
考虑以下代码:#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
我很难找到(我确信这是一种非常常见的)设计模式来解决以下问题。考虑这段代码: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
我记得在讨论最终导致新的上下文关键字override和final的通用属性时,有人建议编译器对这些矿石的支持可能是可选的(我猜它会在标准文本中读作“行为是特定于实现的”)。但我在FDIS和之后的更正中找不到任何关于这种可选性的痕迹。但既然没有找到它不是证据,我不得不问:是否支持如FDIS的2.11p2、9.2和10.3中所述override和final是符合标准的编译器所必需的吗?例如是否要求符合标准的编译器拒绝classFoo{voidfunc()override;//Error:notvirtual,9.2p9};还是通过忽略覆盖仍然符合要求? 最佳答案
这个问题在这里已经有了答案:Functionwithsamenamebutdifferentsignatureinderivedclass(2个答案)关闭7年前。我对以下代码的编译器错误感到困惑:classBase{public:virtual~Base(){}virtualvoidfunc(){}virtualvoidfunc(int){}virtualvoidanother(){}virtualvoidanother(int){}};classDerived:publicBase{public:voidfunc(){}};intmain(){Derivedd;d.func();d.