草庐IT

Inheritance

全部标签

c++ - 按类型对 std::vector 进行排序

我在看http://channel9.msdn.com/Events/GoingNative/2013/Writing-Quick-Code-in-Cpp-Quickly在第36分钟左右,他们讨论了如果您要对集合调用虚拟方法,则按元素类型对集合进行排序的好处。如此给定classBase{};classDer1:publicBase{};classDer2:publicBase{};classDer3:publicBase{};vectormyVector;如何对myVector进行排序,使每种类型的元素都是相邻的?有没有办法不使用虚函数来识别每个派生类型?(也许使用typeid?)

c++ - 将 dynamic_cast 与模板一起使用

在用C++实现基于模板的工厂时,我创建了以下allocator函数来实例化给定的子类:templateParentClass*allocator(){ChildClass*child=newChildClass();ParentClass*parent=dynamic_cast(child);if(NULL==parent){deletechild;returnNULL;}returnparent;}一切正常,但是当通过静态代码分析工具(如coverity)运行代码时,deletechild;行被标记为逻辑死代码。我进行运行时检查的原因是为了断言,ChildClass是从ParentC

c++ - 在不指向对象的情况下调用虚方法?

#includestructA{voidinit(){internal_init();}virtualvoidinternal_init(){std::cout首先,程序按预期进入B::internal_init()。然后,到A::init()(我猜是因为B派生自A,而B没有任何init())。现在呢?它会选择什么internal_init()?因为它进入了B::internal_init(),程序会进入死循环,我不明白为什么。当我调用internal_init()时到底发生了什么?为什么调用实例“B部分”的internal_init()?这是关于“虚拟”的吗?如果是这样,怎么会?虚函

c++ - 用 CRTP 替换非纯虚函数

我正在通过其C++SDK为应用程序编写插件。该机制相当简单。插件通过预定义的接口(interface)提供其功能。这是通过让服务器类从每个接口(interface)的一个实现类继承来完成的,该实现类包含纯虚函数或具有默认实现的非纯函数。这非常实用,因为SDK客户端只需覆盖插件所需的那些方法和/或为(罕见的)没有默认值的方法提供实现。一直困扰我的是,一切都在编译时已知。与运行时多态相关的虚函数表和机制在这里只是为了提供默认实现。我试图在保持便利的同时消除这种开销。作为一个(非常人为的)示例,假设我有几个服务器提供一个接口(interface)(名为Blah),该接口(interface)

c++ - 抽象基类c++的析构函数和无构造函数

我搜索过这个,但我并没有真正理解答案。我是C++的新手,我想要实现的是拥有一个抽象类作为我的对象类型的基类,这样我就可以将我的对象存储在抽象类型的指针数组中类而不是使用void*。此外,我的对象共享一些公共(public)成员函数,这些函数可以通过抽象类实现轻松减少我的代码库。但是,我对抽象类的构造函数和析构函数感到困惑。抽象类实际上并不需要构造函数,因为可以传入的参数对于两者都是通用的,需要对派生类中的所述参数做不同的事情才能正确设置protected属性(矩阵的大小).那么,没有构造函数可以吗?另外,由于我没有构造函数,析构函数应该是什么?我说的是实现虚拟析构函数的答案。但是,我不

java - 在 C++ 中重叠类似 java 的接口(interface)

我在很多地方都读到过,Java的接口(interface)可以使用C++的抽象类和所有纯虚拟方法100%模拟。我正在尝试转换这段java代码:interfaceA{voida();}interfaceBextendsA{voidb();}classCimplementsA{publicvoida(){}}classDextendsCimplementsB{publicvoidb(){}}Dd=newD();d.a();d.b();在C++中变成这样的东西:classA{public:virtualvoida()const=0;protected:virtual~A(){}};class

c++ - protected 派生类

#includeusingnamespacestd;classBase{public:Base(){cout当我执行上面的示例程序时,出现以下错误:protected.cpp:在函数“intmain(int,char**)”中:protected.cpp:26:错误:‘Base’是‘Derived’不可访问的基础为什么不能用基指针创建派生对象????所以我可以创建一个派生类的实例,例如DeriveddDerivedd1=newDerived;但是像这样从基类指针创建实例Base*b=newderived会失败。这是因为Derived在派生过程和私有(private)时实际上不是Base

c++ - c++基类中 protected 字段的问题

我有一个基类,比如说BassClass,它有一些字段,我让它们受到保护,还有一些纯虚函数。然后是派生类,例如DerivedClass,例如classDerivedClass:publicBassClass。DerivedClass不应该继承BassClass的protected字段吗?当我尝试编译DerivedClass时,编译器提示DerivedClass没有任何这些字段,这里有什么问题?谢谢 最佳答案 如果BassClass(sic)和DerivedClass是模板,并且要从DerivedClass访问的BassClass成员>

c++ - 不能覆盖派生类中的静态初始化

我试图为层次结构中的类提供不同的静态初始化,但是当我尝试使用这段代码时:#includeusingnamespacestd;structbase{staticconstchar*componentName;};constchar*base::componentName="base";structderived:publicbase{};constchar*derived::componentName="derived";intmain(){cout我最终遇到了这个构建错误:test.cpp:15:error:ISOC++doesnotpermit‘base::componentName

c++ - 从成员复制方法

我有一个简单的低级容器类,由更高级别的文件类使用。基本上,文件类在将最终版本保存到实际文件之前使用容器在本地存储修改。因此,一些方法直接从容器类转移到文件类。(例如,Resize()。)我刚刚在文件类中定义方法来调用它们的容器类变体。例如:voidFileClass::Foo(){ContainerMember.Foo();}然而,这正变得令人讨厌。有更好的方法吗?这是一个简化的例子:classMyContainer{//...public:voidFoo(){//Thisfunctiondirectlyhandlestheobject's//membervariables.}}cla