草庐IT

c++ - 如何强制在派生类中调用基类构造函数?

基本的C++问题我很确定。如果我有一个带有不带参数的构造函数的基类,并且只初始化一些protected成员,那么如果派生类与参数匹配(一厢情愿但不太可能想到),派生类是否也会立即调用该基构造函数,如果没有,是有没有办法强制它从派生类自动调用所述基构造函数,而不必在派生类中明确告诉它这样做?我问是因为我正在编写各种包装器并且有一些protected成员我想最初初始化为特定值,然后我想根据我的需要派生和操作这个基类,但我不喜欢外部用户必须记住显式调用基本构造函数或在它们自己的构造函数中设置这些值。 最佳答案 是的,除非另有明确说明,否则

c++ - 派生类实例共享同一个基类实例

假设我有一个具有以下接口(interface)的Proc类:classProc{public:voidprocess();protected:virtualvoiddo_process()=0;private:intm_counter;};现在,假设我有两个实现Proc接口(interface)的派生类。classDerivedProc1:publicProc{protected:virtualvoiddo_process();};classDerivedProc2:publicProc{protected:virtualvoiddo_process();};现在我生成两个派生类:Pr

c++ - 调整模板提供的基类

如果基类不提供方法,您将如何填充方法。如果提供了基类方法,我想重用它。例如:#includestructBase0{};structBase1{voidm(){std::coutstructDerived:publicT{//ifTdoesn'tprovidem,defineithere,otherwisereusethebaseclassmethodvoidm(){/*?std::coutd0;d0.m();//shouldprint"Derived"Derivedd1;d1.m();//shouldprint"Base1"} 最佳答案

c++ - 转换为基类有效性

假设我有一个名为Base的类和一个从它派生的名为SuperBase的类。假设add接受了一个Base*,那么这些是否有效:SuperBase*super=newSuperBase;bases.add(super);或者SuperBase*super=newSuperBase;bases.add((Base*)super); 最佳答案 只要SuperBase通过从派生到基的隐式转换公开派生自Base,第一个就可以工作:structbase{virtual~base(){}};structderived:base{};base*b=ne

c++ - 为什么派生类重写了基类的方法,还要调用基类的方法?

考虑以下程序:classBase{public:virtualvoidfoo()const{cout如果我从Base类foo方法中删除const,则Derived::foo()是叫。我似乎无法理解这种行为。1)这种行为的原因是什么?2)这是编译时还是运行时决定的?谢谢 最佳答案 在派生类中,函数签名是这样的:virtualvoidfoo();//Derived::foo其中没有提到const。它是一个非常量成员函数,而Base::foo是一个const成员函数。它们是两个不同的函数,因为const是函数签名的一部分。virtualv

c++ - 如何覆盖另一个基类中的函数?

我不太确定要使用的术语,但这是我的示例:classBase{public:virtualvoidtest()=0;};classMixin{public:virtualvoidtest(){}};classExample:publicBase,publicMixin{};intmain(intargc,char**argv){Exampleexample;example.test();return0;}我希望我的Mixin类实现纯虚函数Base::test,但是当我编译它时,它说:test.cpp:Infunction‘intmain(int,char**)’:test.cpp:15:

c++ - 当派生类的析构函数是虚拟的而基类的 dtor 不是时代码崩溃

我在gcc4.4.5上尝试了以下代码。如果成员“data”不存在,代码执行正常,但在它存在的情况下,它会崩溃。当派生类的dtor不是虚拟时,它也不会崩溃。我知道在这两种情况下行为都是未定义的,如C++03(5.3.5/3)中所列,但仍然有人可以向我提供一些解释,为什么它在后一种情况下崩溃了?是的,我知道UB意味着任何事情都可能发生,但仍然我想知道特定于实现的细节。#includeusingstd::cout;structbase{intdata;base(){cout 最佳答案 假设在我的系统(gcc4.6.0,linuxx86_6

c++ - 创建派生类的模式,派生类本身和基类都包含许多字段

鉴于以下预先存在的框架,我需要找到好的设计模式来创建派生类的不同实例。我面临的主要挑战如下:challenge-1>每个类都有10多个字段,如何有效地将这些字段传递给派生类,再传递给基类。针对这个问题,我可以想出四个解决方案,但没有一个对我有吸引力。方法一>以简单格式传递所有参数classA::classA(intfield1,floatfield2,...,doublefield29)=>缺点:创建传入参数超过6~7个的函数不是一个好主意方法2>将所有参数作为结构传递structDataClassA{intfield1;floatfield2;...doublefield29;};s

c++ - C++菱形继承(钻石问题)中如何调用所有基类的拷贝构造函数来拷贝大部分派(dispatch)生类对象?

考虑下面的代码:#includeusingnamespacestd;classA{public:A(){cout程序的输出如下:13571358因此,对于行Dd(d1)D的拷贝构造函数正在调用类。在继承过程中,我们需要显式调用基类的复制构造函数,否则只会调用基类的默认构造函数。到这里我才明白。我的问题:现在我想在Dd(d1)期间调用所有基类的复制构造函数执行。为此,如果我在下面尝试D(constD&obj):A(obj),B(obj),C(obj){cout然后我得到这个错误:错误:'classAA::A'isinaccessiblewithinthiscontext如何解决这个问题。

c++ - 如何在 C++ 中使用基类实现流畅的接口(interface)

如何在C++中实现这个流畅的接口(interface):classBase{public:Base&add(intx){return*this;}}classDerived:publicBase{public:Derived&minus(intx){return*this;}}Derivedd;d.add(1).minus(2).add(3).minus(4);当前代码不工作,因为基类对派生类等一无所知。如果有提示/建议,我将不胜感激。 最佳答案 使基类模板化。使用所需的Base模板类型返回类型,如下所示:templateclass