最近,我用Java做了很多编程。在那里,你用super()调用你继承的类。(你可能都知道。)现在我有一个C++类,它有一个带有一些参数的默认构造函数。示例:classBaseClass{public:BaseClass(char*name);....如果我继承了这个类,它会警告我没有合适的默认构造函数可用。那么,在C++中是否有类似super()的东西,还是我必须定义一个函数来初始化所有变量? 最佳答案 您在子类的构造函数的初始化列表中执行此操作。classFoo:publicBaseClass{public:Foo():BaseC
因为我习惯了Python中鸭子类型的旧方法,所以我无法理解对ABC(抽象基类)的需求。help善于使用它们。我试图阅读PEP中的基本原理,但它超越了我的头脑。如果我正在寻找一个可变序列容器,我会检查__setitem__,或者更有可能尝试使用它(EAFP)。我还没有遇到numbers的实际用途。模块,它确实使用了ABC,但这是我必须理解的最接近的。谁能给我解释一下原因? 最佳答案 @Oddthinking的回答没有错,但我认为它错过了真正的,实用Python在鸭式打字世界中拥有ABC的原因。抽象方法很简洁,但在我看来,它们并不能真正
我编写了以下代码来解释我的问题。如果我注释第11行(使用关键字“using”),编译器不会编译文件并显示此错误:invalidconversionfrom'char'to'constchar*'。Son类中似乎没有看到Parent类的方法voidaction(char)。为什么编译器会这样?还是我做错了什么?classParent{public:virtualvoidaction(constcharhow){this->action(&how);}virtualvoidaction(constchar*how)=0;};classSon:publicParent{public:usin
基类指针可以指向派生类对象。为什么如果不进行强制转换,反之亦然?从逻辑上讲,基类不会有足够的派生类信息,但派生类也应该有基类的信息。我在这里缺少一些基础知识。 最佳答案 如果我告诉你我有一只狗,你可以放心地假设我有一只宠物。如果我告诉你我有一只宠物,你不知道那只动物是不是狗,它可能是一只猫,甚至可能是一只长颈鹿。如果不知道一些额外的信息,你不能安全地假设我有一只狗。类似地,派生对象是基类对象(因为它是子类),所以它可以被基类指针指向。但是,基类对象不是派生类对象,因此不能将其分配给派生类指针。(你现在听到的吱吱声是类比拉伸(stre
在玩Lambdas时,我发现了一个我不完全理解的有趣行为。假设我有一个从2个模板参数派生的structOverload,并且有一个usingF1::operator();子句。现在,如果我从两个仿函数派生,我只能访问F1的operator()(如我所料)如果我从两个Lambda函数派生,这将不再正确:我也可以从F2访问operator()。#include//Icompiledwithg++(GCC)4.7.220121109(RedHat4.7.2-8)////g++-Wall-std=c++11-gmain.cc//g++-Wall-std=c++11-DFUNCTOR-gmain
我有一个类B有一组构造函数和一个赋值运算符。这里是:classB{public:B();B(conststring&s);B(constB&b){(*this)=b;}B&operator=(constB&b);private:virtualvoidfoo();//andotherprivatemembervariablesandfunctions};我想创建一个继承类D,它只会覆盖函数foo(),不需要做其他的改变。但是,我希望D具有与B相同的一组构造函数,包括复制构造函数和赋值运算符:D(constD&d){(*this)=d;}D&operator=(constD&d);我必须在
为什么我不能这样做?classA{public:inta,b;};classB:publicA{B():A(),a(0),b(0){}}; 最佳答案 您不能在B中初始化a和b,因为它们不是B的成员。它们是A的成员,因此只有A可以初始化它们。您可以将它们公开,然后在B中进行赋值,但这不是推荐的选项,因为它会破坏封装。相反,在A中创建一个构造函数以允许B(或A的任何子类)初始化它们:classA{protected:A(inta,intb):a(a),b(b){}//Accessibletoderivedclasses//Change"
我有一个classA,它为其一个字段使用堆内存分配。类A被实例化并存储为另一个类中的指针字段(classB.当我处理完B类的对象后,我调用delete,我假设它调用了析构函数...但这是否也调用了A类的析构函数?编辑:从答案中,我认为(如果不正确,请编辑):deleteB实例调用B::~B();调用A::~A();A::~A应该显式deleteA对象的所有堆分配的成员变量;最后,存储B类实例的内存块返回到堆中-当new被使用时,它首先在堆上分配一block内存,然后调用构造函数来初始化它,现在之后已调用所有析构函数以完成对象,将对象所在的block返回到堆中。
看看下面的代码:structA{public:virtualvoidf(){std::cout据我了解,B::f()在C应该隐藏A::f()被带到C通过使用声明;如果是,那为什么c.C::f()还是调用A::f()?如果c.C::f()来电A::f(),这应该意味着在C的范围内,f()应始终引用A::f(),这是使用声明的功能。那为什么在C::test(),调用f()仍被评估为B::f()? 最佳答案 非常好的问题,名称查找的复杂案例。基本上,当名称f在C的范围内查找时,它总是找到A::f由于使用声明。所以C::test()中的所有
看看下面的代码:structA{public:virtualvoidf(){std::cout据我了解,B::f()在C应该隐藏A::f()被带到C通过使用声明;如果是,那为什么c.C::f()还是调用A::f()?如果c.C::f()来电A::f(),这应该意味着在C的范围内,f()应始终引用A::f(),这是使用声明的功能。那为什么在C::test(),调用f()仍被评估为B::f()? 最佳答案 非常好的问题,名称查找的复杂案例。基本上,当名称f在C的范围内查找时,它总是找到A::f由于使用声明。所以C::test()中的所有