草庐IT

c++ - 将基类函数标记为 virtual 和 final 有什么意义吗?

这个问题在这里已经有了答案:What'sthepointofafinalvirtualfunction?(11个答案)关闭5年前。在variousexplanationsC++11的final关键字,我看到了这样的例子。classbase{public:virtualvoidf()final;};classderived:publicbase{public:virtualvoidf();//Illegalduetobase::f()declaredfinal.};这实际上是final的有用用法吗?为什么要在基类中声明一个虚函数(暗示它可以在派生类中有用地重写)然后立即将其标记为fina

c++ - 在 C++ 中,检查一个基类的两个实例是否属于同一个子类

下面的代码解释了这个问题。填写same_sub_class检测是否指向虚拟基类A的两个指针实际上是相同的具体类。structA{...}:structB:publicA{...}:structC:publicA{...}boolsame_sub_class(A*a1,A*a2){//Fillthisintoreturntrueifa1anda2are//ofthesameconcreteclass}编辑:当我查看我的应用程序时,我需要一些与上面略有不同的东西。我需要能够按type_id对实例进行分组。仅供引用。我有一个迷你符号代数系统,因此要进行操作,有时了解类类型对于排序和重新排列表

c++ - 多重继承不明确的基类

考虑代码structBase{};structDerived:publicBase{};structA:publicBase{};structB:publicA,publicBase{};structC:publicA,publicDerived{};//whynoambiguityhere?intmain(){}编译器(g++5.1)警告warning:directbase'Base'inaccessiblein'B'duetoambiguitystructB:publicA,publicBase{};我明白了,Base在B中重复了。为什么C没有警告?C不是同时继承自A和Derive

c++ - 通过指向非多态类型的基类的指针获取已分配内存的地址

简单的多重继承structA{};structB{};structC:A,B{};或虚拟继承structB{};structC:virtualB{};请注意类型不是多态的。自定义内存分配:templateT*custom_new(Args&&args...){void*ptr=custom_malloc(sizeof(T));returnnew(ptr)T(std::forward(args)...);}templatevoidcustom_delete(T*obj){if(!obj)returnobj;void*ptr=get_allocated_ptr(obj);//hereass

C ++中的多态性。在基类上调用继承的方法

我正在尝试实现一个简单的文件系统。我有一个基类条目。我有两个从称为文件和目录的条目继承的类。目录包含条目对象列表。我有一种称为目录和文件的称为更改的方法,但没有输入。我希望我可以在输入对象上调用此方法,并且编译器会根据条目是目录还是文件来知道使用哪种方法。有什么方法可以做到这一点?classEntry{public:std::chrono::time_pointdateCreated;std::stringfileName;Entry(std::stringname);~Entry();};Directory*Directory::changeDir(Directory*dir,Directo

C++:比较基类和派生类的指针

我想要一些关于在这种情况下比较指针时的最佳实践的信息:classBase{};classDerived:publicBase{};Derived*d=newDerived;Base*b=dynamic_cast(d);//WhencomparingthetwopointersshouldIcastthem//tothesametypeordoesitnotevenmatter?booltheSame=b==d;//Or,booltheSame=dynamic_cast(b)==d? 最佳答案 如果你想比较任意类层次结构,安全的做法是

c++ - 从没有虚方法的基类继承是不好的做法吗?

我曾经读过一个关于dynamic_cast问题的答案。dynamic_cast无法工作,因为基类没有虚方法。其中一个答案说,从没有虚方法的类派生通常意味着糟糕的设计。这个对吗?即使不利用多态性,我仍然看不出这样做有什么错误。 最佳答案 这取决于我们在谈论什么:对于Traits类(无数据)没问题(想到了std::unary_function)对于private继承(用于代替组合以从空基优化中受益)也很好当您开始以多态方式处理此类Derived对象时,问题就出现了。如果您达到了这样的位置,那肯定是代码味道。注意:即使上面提到的很好,您仍

c++ - 在基类中返回抽象类型

在类层次结构的设计中,我使用了一个抽象基类,它声明了派生类将实现的各种方法。从某种意义上说,基类与C++中的接口(interface)一样接近。但是,有一个特定的问题。考虑下面声明我们的接口(interface)类的代码:classInterface{public:virtualInterfacemethod()=0;};classImplementation:publicInterface{public:virtualImplementationmethod(){/*...*/}};当然,这不会编译,因为您不能在C++中返回抽象类。为了解决这个问题,我使用了以下解决方案:templa

c++ - 检查模板类的某些特化是否是特定类的基类的特征

现代STL中有std::is_base_of。它允许我们确定第二个参数是否派生自第一个参数,或者它们是否是相同的类,否则,确定它们之间是否没有这种关系。是否可以在不区分其特化涉及哪些具体实际参数的情况下确定一个类是否派生自某个具体模板类?说,我们有;templatestructB{};和templatestructD:B{};是否可以定义类型特征:templateis_derived_from_B;当T是D的任何特化并从std::派生时,它从std::true_type派生:false_type如果T不是从B的任何特化派生的? 最佳答案

c++ - 为什么不允许在非推导上下文中使用基类定义,以及如何解决这个问题?

我有以下代码:#includetemplatestructBase{usingType=int;};templatestructDerived:Base{//uncommmentingthebelowcausecompilererror//usingAlias=Type;};intmain(){Derived::Typeb=1;std::cout现在类型名Type可用于Derived如果它在推导的上下文中-如b的完全有效声明所示.但是,如果我尝试引用Type在Derived的声明中本身,然后我得到一个编译器错误,告诉我Type不命名类型(例如,如果Alias的定义未注释)。我想这与编译