特别是在C++中,但通常也作为OO设计原则,执行以下操作有什么问题吗?它在实践中完成了吗?如果它显示出明显的设计缺陷,那么什么是好的替代方案?有什么优势吗?classProperty{};classCompositeProperty:publicProperty{...private:std::vectorm_properties;};具体来说,派生类可以包含基类对象吗?作为我的背景知识,我已经看到它用于建模/镜像XML结构,但感觉设计在某种程度上违背了is-a-is-inheritance和has-a-is-composition关系,对于这些关系通常努力。
我可以在函数指针和子类对象之间做出选择。为了清楚起见,假设我必须通知某个对象某些操作(例如计时器);请引用以下两个选择(用于演示目的的非常基本的代码):版本1typedefvoidTimerCallback(void*args);classTimer{public:Timer();~Timer();voidschedule(TimerCallback*callback,void*args,longtimeout)=0;voidcancel();};版本2classTimerTask{public:TimerTask();virtual~TimerTask();voidtimedout(
我有一组自定义类Student对象。CourseStudent和ResearchStudent都继承自Student,Student的所有实例都是其中之一。我有一个函数可以遍历数组,确定每个学生的子类型,然后对它们调用特定于子类型的成员函数。问题是,因为这些函数没有被重载,所以在Student中找不到,所以编译器大惊小怪。如果我有一个指向Student的指针,是否有办法获得指向该Student子类型的指针?我是否需要在此处进行某种伪造的转换以绕过编译时错误? 最佳答案 最好的办法是使用虚函数:classStudent{//...vi
有谁知道用CRTP统计一个对象的子类个数的方法吗?假设我们有一个类似于以下的设置:templateclassObject{....};constunsignedintObjectSubClassCount=...;classSubobject:publicObject{....};classSecond:publicObject{....};等等,这样一来,使用TMP,我们可能有一个常量(ObjectSubClassCount)代表子类的总数?有谁知道这样做的方法吗?编辑:我想稍后将结果用作模板参数,所以我需要用TMP来完成... 最佳答案
假设我有一个实例化的Baseb。Foo是Base的子类。我想要做的是拥有一个Foo的构造函数classFoo:publicBase{Foo(Baseb,TotherArg):Base(b){/*ToDo-dosomethingwithotherArg*/}}将“b”实例移动到正在构建的Foo实例。如果Foo的构造失败(例如,在我的/*ToDo步骤*/中),则不应移动b。我可以在C++11中执行此操作吗?(我买不起深拷贝)。构造函数原型(prototype)是否需要为Foo(Base&&b,TotherArg)? 最佳答案 是的,你可
这是我的案例:classA{public:virtualA*clone()=0;};classB:publicA{virtualB*clone()override{returnnewB();}};在我的代码中,现在100%的A子类都以完全相同的方式实现clone方法,仅对类D我已经返回键入D,我当然会创建D的对象。如何防止这种重复?哪些模式或技巧可以提供帮助?我想过使用CRTPpattern,但它使用模板,我的功能是虚拟的。据我们了解,模板和虚函数是不兼容的。NVIpattern也不起作用,因为克隆方法的返回类型不同。 最佳答案 [
我正在寻找一种方法来检查子类是否覆盖了其基类上的函数。如果成员函数指针不是虚拟的,则比较成员函数指针工作得很好,但如果它们是是虚拟的,则它不起作用。这个示例代码基本上就是我遇到的问题。classBase{public:virtualvoidvfoo(){cout从逻辑上讲,没有理由不这样做,但C++规范另有规定(以这种方式比较虚函数地址是实现定义的)。在GCC上,输入双关语&Base::vfoo和&Child::vfoo到int使它们都为“1”(vbar为“9”),这看起来是vtable偏移量。以下代码似乎正确地从vtable中获取了函数地址,并正确地报告了Child::vfoo和Ba
给定遗留代码,系统具有以下类层次结构:Base^|----------+---------------^^^^^|||||A1B1C1D1E1^^^^^|||||A2B2C2D2E2.......^^^^^|||||AnBnCnDnEn层次结构表示某个特定域中的消息。Base类当然是所有消息的基类。A1..E1是属于域版本1的消息,A2..E2属于版本2,依此类推。请注意,An必须直接继承自An-1,因为An会覆盖An-1的特定方法。有一些功能对所有消息都是通用的,所以它被定义为Base::PerformFunctionality。部分功能仅特定于版本n,因此存在虚函数Base::Sp
我正在尝试将一些子类元素添加到一个vector中,遍历它们调用一个被覆盖的方法,并希望它在可能的情况下调用被覆盖的方法。但是我发现它似乎只调用父类(superclass)方法。我学过Java,但不确定为什么要在C++中这样做。我尝试使用父类(superclass)的指针vector重写代码并将子类的指针转换到父类(superclass)。然后通过指针访问它。理想情况下,我不想将指针列表放入vector中,因为我必须手动删除每个指针(我相信?)以阻止内存泄漏,因为我将使用new创建对象,以便它们持续到方法调用以将它们添加到vector中。有没有更好的方法来做到这一点,或者我是否坚持使用指
这段简单的代码可以用clang++编译,但不能用g++。里面有什么undefined吗?(需要模板函数才能让clang开心)GCC8.2.0(与-std=c++17一起使用)表示operator#include#include#includetemplateOut&&operator(out);}structA:std::stringstream{};intmain(){A{} 最佳答案 我相信这是由Bug51577引起的海湾合作委员会。您的代码导致std::__is_insertable&,std::nullptr_t&,void