草庐IT

overriding

全部标签

c++ - 为什么覆盖虚函数时不考虑访问限定符?

以下代码打印“I'mB!”。这有点奇怪,因为B::foo()是私有(private)的。关于A*ptr,我们可以说它的静态类型是A(foo是public),它的动态类型是B(foo是私有(private)的)。所以我可以通过指向A的指针调用foo。但是这样我就可以访问B中的私有(private)函数。可以算作封装违规吗?由于访问限定符不是类方法签名的一部分,因此会导致这种奇怪的情况。为什么在覆盖虚函数时不考虑C++中的访问限定符?我可以禁止这种情况吗?这个决定背后的设计原则是什么?Liveexample.#includeclassA{public:virtualvoidfoo(){st

c++ - Destructor间接调用虚函数

让我声明一下:我对Constructor或Destructor中的虚函数调用有清楚的理解。在下面的代码中,我试图避免仅出于实验目的的虚拟析构函数。现在我的问题是:在main中,对Destroyfun的调用调用了正确的虚函数。我期望对DestroyFunction的任何调用都应该调用正确的虚拟函数。但是放置在Base析构函数调用的Base虚函数中的同一个Destroy函数。这与静态绑定(bind)或编译器优化有关吗?classBase{public:Base(){}voidDestroy(){callVirtual();}virtualvoidcallVirtual(){cout.cla

c++ - 为什么我的函数不跳过尝试解析为不兼容的模板函数,而是默认解析为常规函数?

这个问题在这里已经有了答案:Whycan'tatemplatefunctionresolveapointertoaderivedclasstobeapointertoabaseclass(1个回答)关闭8年前。std::stringnonSpecStr="nonspecializedfunc";std::stringconstnonTemplateStr="nontemplatefunc";classBase{};classDerived:publicBase{};templatestd::stringfunc(T*i_obj){(*i_obj)+=1;returnnonSpecStr

c++ - 为什么 GCC 给我一个错误 : no unique final overrider?

在下面的代码中,我收到以下警告和错误:test.cpp:15:warning:directbase'B'inaccessiblein'D'duetoambiguitytest.cpp:15:error:nouniquefinaloverriderfor'virtualvoidA::f()'in'D'但是如果我从A中移除B的虚拟继承(即structB:publicA),我只会得到警告,没有错误。structA{virtualvoidf()=0;};structB:publicvirtualA{voidf(){}};classC:publicB{};structD:publicC,virt

c++ - 基类重载方法,默认成员变量

我有一个类结构如下:classBase{public:voidsetDefault(uint8_tmy_default){m_default=my_default;}voidmethod(uint8_t*subject){method(subject,m_default);}virtualvoidmethod(uint8_t*subject,uint8_tparameter)=0;protected:uint8_tm_default;};classDerived1:publicBase{public:voidmethod(uint8_t*subject,uint8_tparameter

c++ - 用私有(private)基函数覆盖公共(public)虚函数?

让我们考虑具有以下接口(interface)的两个类A和B:classA{public:virtualvoidstart(){}//defaultimplementationdoesnothing};classB{public:voidstart(){/*dosomestuff*/}};然后是从两者继承的第三个类,A是公开的,因为它实现了这个“接口(interface)”,B是私有(private)的,因为那是实现细节。但是,在这个特定的实现中,start()只需要包含对B::start()的调用。所以我想我可以使用快捷方式并执行以下操作:classC:publicA,privateB

c++ - 为什么必须将 "virtual"放入基类而不是仅在子类中使用 "override"?在 C++ 中

标题几乎说明了一切。为什么要在基类中定义以后可能重写的函数?如果您想从中派生出不同行为的版本,那么您必须修改基类,并且您还没有考虑过将基类中的特定函数标记为虚拟。据我所知,您通过使用override解决了java中的此类抽象定义,这对我来说似乎更自然(尽管到目前为止我只关注java)。c++中的这种扭曲是为了强制程序员提前思考,还是有技术原因导致它这样工作? 最佳答案 这样做是为了使成员函数成为虚函数的决定保留在基类中。决定将一个函数设为虚函数会对设计产生影响:如果你将一个函数设为虚函数,你必须考虑它执行不同操作的可能性。相反,您可

c++ - 强制派生类覆盖至少一个虚函数

想象一下这个简单的基类:structsimple_http_service{virtualreplyhttp_get(…);virtualreplyhttp_post(…);virtualreplyhttp_delete(…);//etc.};我想阻止用户从此类派生而不覆盖至少其中一个,并阻止他们实例化simple_http_service有什么好的方法可以做到这一点吗? 最佳答案 这听起来像是一个非常奇怪的约束。一定要保护用户免受不正确的使用,但不要试图禁止您只是“看不到重点”的事情。如果在不覆盖这三个函数中的任何一个的情况下从你

c++ - 哪个更好 : Function overriding or passing a function pointer for event handling

因此,我正在为一个类编写代码,该类将进入一个供其他人使用的库。此类将拦截和处理传入的消息(细节并不重要,但它使用activemq-cpp库)。这个消费类的轮廓是classMessageConsumer{...public:voidrunConsumer();virtualvoidonMessage(constMessage*message);}其中runConsumer()建立连接并开始监听,并在收到消息时调用onMessage()。我的问题是:使用此代码的人将各自有自己的方式来处理不同的消息。我怎样才能保持MessageConsumer通用但提供这种灵active,同时保持代码简单?

c++ - C++ 中的覆盖方法

有时我在重写方法时不小心忘记在C++中调用父类(superclass)的方法。有什么方法可以帮助我确定何时重写方法,这样我就不会忘记调用父类(superclass)的方法吗?(类似于Java的@Override,除了C++没有注解...) 最佳答案 一个建议是Non-VirtualInferfaceIdiom.即,使您的公共(public)方法成为非虚拟方法,并让它们调用派生类可以覆盖的私有(private)或protected虚拟方法,以实现它们的特定行为。如果您无法控制基类,您或许可以使用中间类:classFoo//Don'tc