草庐IT

c++ - 成员模板函数不能是虚拟的 - 解决方法?

我明白为什么membertemplatefunctionscannotbevirtual,但我不确定最好的解决方法是什么。我有一些类似的代码:structEntity{templatevirtualItGetChildren(Itit){returnit;}};structPerson:publicEntity{templatevirtualItGetChildren(Itit){*it++="Joe";}};structNode:publicEntity{Nodeleft,right;constchar*GetName(){return"dummy";}templatevirtual

c++ - C++ 中具有多个可访问参数的访问者模式

考虑以下层次结构:classBase{virtualvoidMethod()=0;virtualvoidAccept(Visitor*iVisitor)=0;};classDerived1:publicBase{virtualvoidMethod(){//impl}virtualvoidAccept(Visitor*iVisitor){iVisitor->Visit(this);}};classDerived2:publicBase{virtualvoidMethod(){//impl}virtualvoidAccept(Visitor*iVisitor){iVisitor->Visi

c++ - 从父类(super class)调用子类中的虚函数

我知道这个问题一定被无数次问过,但我搜索了以前的问题,似乎什么也没有。它是关于C++中的继承和虚函数。我在从父类(superclass)的子类中调用虚函数时遇到问题。我举个例子。从三个相互继承的类开始。classA{voidfoo(){bar()}virtualvoidbar(){}};classB:publicA{virtualvoidbar(){}};classC:publicB{virtualvoidbar(){//dosomething}};现在我想要一个声明为B*但实例化为C*的变量。B*myObject=newC();myObject->foo();当我这样做并在myObj

c++ - 在没有悬挂指针的情况下返回 C++ 中的抽象数据类型

你好,我有C#背景,没有很多C++经验。为了生成干净的代码,我尝试将实现和接口(interface)分开,并尽可能使用继承。当我尝试将典型的C#概念应用到C++时,我遇到了一个到目前为止我无法解决的问题。我认为这对于经验丰富的C++程序员来说可能是微不足道的,但它已经让我发疯了很长一段时间。首先我声明一个基类(目前它不包含逻辑但将来会包含)classPropertyBase:publicIProperty{};然后我为属性定义一个接口(interface)classIProperty{public:virtual~IProperty(){};virtualPropertyBasecor

c++ - 虚拟继承情况下类的大小

谁能解释一下在涉及虚函数的虚继承的情况下类的大小。classA{chark[3];public:virtualvoida(){};};classB:publicA{charj[3];public:virtualvoidb(){};};classC:publicvirtualA{chari[3];public:virtualvoidc(){};};classD:publicB,publicC{charh[3];public:virtualvoidd(){};};类大小的输出是:sizeof(A):8sizeof(B):12sizeof(C):16sizeof(D):32我使用的编译器是g

c++ - 我是否应该让一个成员函数成为虚拟的只是为了让一个类可测试?

我正在研究一个简化版本如下所示的类:classHttp_server{public:voidstart(intport){start_server();std::stringcontent_type=extract_content_type(get_request());}private:voidstart_server(){...}std::stringget_request(){...}std::stringextract_content_type(conststd::string&request)const{...}};现在我想为extract_content_type编写一个测

c++ - 未调用虚拟方法

我有一个名为Panel的基类,其中存储了一些关于窗口的信息,然后,我有所有控件的子类:Button、Label等。在基类中,我有virtualvoidApplySchemeSettings(Scheme*scheme){}方法,在Panel(Panel*parent)构造函数中调用。但是调用的不是子类,而是来自基类(Panel)的ApplySchemeSettings。classPanel{[...]public:virtualvoidApplySchemeSettings(Scheme*scheme){};Panel(Panel*parent){[...]this->ApplySch

c++ - 多态性和默认值 : can co-exist?

这个问题在这里已经有了答案:virtualfunctiondefaultargumentsbehaviour(7个答案)关闭8年前。我有一个包含许多继承派生类的基类。像这样:classA{public:virtualvoidf(stringfoo="bar"){cout为简洁起见,我只继承了两个类。这是主要的:A*aArray[]={newB,newC,};intmain(){aArray[0]->f();aArray[0]->f();return0;}当我运行程序时,我得到的输出是:barbar就像编译器忽略重写函数的默认参数一样。这是正常现象,还是我做错了什么或遗漏了什么?

c++ - 如何在没有多态效果的情况下调用虚方法?

我有引用ref:Foo&ref=..我想调用一个方法ref.say(),它在Foo中被定义为虚拟的,我确信它在子类中被覆盖了(因为我也写了它们)。但是我想调用say就好像它不是不是多态的,所以版本是在Foo中定义的,而不是在子类中定义的。怎么做?我想到的一件事是采用ref的指针,而不是取消引用它,这个技巧应该会杀死多态性,但我不确定这是否能保证达到预期的效果。请注意,我没有坐在Foo或其任何子节点中,Foo树是我当前POV的外部结构。 最佳答案 怎么样ref.Foo::say();这就是你要找的?

C++ : union of two types without virtual base class inheritance

是否可以在不手动创建交集类型的情况下创建两种类型的并集?问题是在我的上下文中交集类是完全没有意义的,所以创建它会使代码用户感到困惑。我的实际案例:我正在描述一个数字硬件模拟器,它是许多模块的分层树状结构:classport;classmodule0{porta,b,c;}classmodule1{portc,d,e;}我需要创建这两种类型的union:classtop_level_module{porta,b,c,d,e;}我想应该有一些技术来创建union类型(这是我要问的问题):classtop_level_module:union_type{//porta,b,c,d,e;}但是