我看到这段用C++编写的代码:#includeusingnamespacestd;classBase{public:virtualintfun(inti){coutfun(10);return0;}输出:Derived::fun(intx)called在以下情况下:#includeusingnamespacestd;classBase{public:virtualintfun(inti){}};classDerived:publicBase{private:intfun(intx){}};intmain(){Derivedd;d.fun(1);return0;}输出:编译器错误。谁能解
对于类B和派生类D:classB{intb;};classD:publicB{intd;};D*d=newD();B*b=dynamic_cast(d);上面的代码可以正常工作——这是一个简单的向上转换。我们确信无论b指向什么,它都有B类(子)对象。但是,B*b=newD();D*d=dynamic_cast(b);不会编译,即使b指向一个有效的D实例——因为基类不是多态的。所以只添加一个空虚方法就可以解决问题。重要的问题是为什么C++要求源类型是多态的?我找到的唯一解释是this,但它只是说“因为这就是它在内部实现的方式”——至少在我看来是这样)。设计dynamic_cast的人可能
我有一个从另一个派生的类,我使用一个基类指针数组来保存派生类的实例,但是因为数组是基类的,所以我无法使用指针访问属于派生类的成员符号,我是否可以使用简单的命令访问这些成员,或者我是否应该重写我的基类以定义成员并仅在派生类中使用它?例子:classA{public:intfoo;};classB:publicA{public:charbar;};classC:publicA{inttea;};intmain(){A*arr[5];arr[0]=newB;chartest=arr[0]->bar;//visualstudiohighlightsthiswithanerror"classAh
我有一个类widget.我有一个抽象类base与衍生物derived_a,derived_b等我要widget保存从base派生的任意数量的对象以便以后多态地使用它们。我的第一次尝试是这样的:#include#include#include#includeclasswidget{public:explicitwidget(std::vector>&¶ms):members{std::move(params)}{}private:std::vector>members;};并且会这样调用:std::vector>v;v.push_back(std::move(std::make_
存储基类指针列表的常见做法是什么,每个基类指针都可以描述一个多态派生类?为了详细说明并考虑一个简单的示例,让我们假设我有一组具有以下目标的类:一个抽象基类,其目的是在其派生类上强制执行通用功能。一组派生类:可以执行通用功能、本质上可复制(这很重要)并且可序列化。现在除了这个必需的功能之外,我还想解决以下关键点:我希望这个系统的使用是安全的;我不希望用户在错误地将基类指针转换为错误的派生类型时出现未定义的错误。此外,我希望尽可能多地自动处理复制/序列化此列表的工作。这样做的原因是,随着新的派生类型的添加,我不想搜索许多源文件并确保所有内容都兼容。下面的代码演示了一个简单的例子,以及我提出
为了问题的缘故,这被大大简化了。假设我有一个层次结构:structBase{virtualintprecision()const=0;};templatestructDerived:publicBase{typedefTraits::TypeType;Derived(Typedata):value(data){}virtualintprecision()const{returnPrecision;}Typevalue;};我想要一个带有签名的非模板函数:Base*function(constBase&a,constBase&b);其中函数结果的特定类型与a和b中具有较大Precisio
我正在尝试编写一个带有一些纯虚拟二元运算符的抽象类,这些运算符应该由派生类实现,以实现运算符多态性。这是一个简化的示例:classBase{public:virtualconstBase&operator+(constBase&)const=0;};classDerived:publicBase{public:constDerived&operator+(constDerived&)const;};constDerived&Derived::operator+(constDerived&rvalue)const{returnDerived();}现在运算符做什么并不重要,重要的是它返回
这个问题在这里已经有了答案:virtualfunctiondefaultargumentsbehaviour(7个答案)关闭8年前。我有一个包含许多继承派生类的基类。像这样:classA{public:virtualvoidf(stringfoo="bar"){cout为简洁起见,我只继承了两个类。这是主要的:A*aArray[]={newB,newC,};intmain(){aArray[0]->f();aArray[0]->f();return0;}当我运行程序时,我得到的输出是:barbar就像编译器忽略重写函数的默认参数一样。这是正常现象,还是我做错了什么或遗漏了什么?
我有引用ref:Foo&ref=..我想调用一个方法ref.say(),它在Foo中被定义为虚拟的,我确信它在子类中被覆盖了(因为我也写了它们)。但是我想调用say就好像它不是不是多态的,所以版本是在Foo中定义的,而不是在子类中定义的。怎么做?我想到的一件事是采用ref的指针,而不是取消引用它,这个技巧应该会杀死多态性,但我不确定这是否能保证达到预期的效果。请注意,我没有坐在Foo或其任何子节点中,Foo树是我当前POV的外部结构。 最佳答案 怎么样ref.Foo::say();这就是你要找的?
是否可以从B调用虚函数foo(int)而无需使用注释中的内容?classA{public:virtualvoidfoo(char*){}virtualvoidfoo(int){}};classB:publicA{public:voidfoo(char*){}//voidfoo(inti){////A::foo(i);//}};Bb;b.foo(123);//cannotconvertargument1from'int'to'char*' 最佳答案 是的,这是可能的。这里的问题是函数B::foo(char*)隐藏继承函数A::foo(