草庐IT

继承权

全部标签

c++ - 阻止虚拟继承

在现代C++中是否有一种方法可以防止类被虚拟继承,同时允许常规继承?现在对我来说这似乎是不可能的,但这种语言中有太多似乎不可能的东西。 最佳答案 为继承基指定的virtual关键字的目的是防止它在继承层次结构中多次实例化。所以首先不能阻止使用它(另见'Whatisavirtualbaseclass')。我相信您可能对如何通过继承类来控制实际可以覆盖的内容感到困惑。如果您没有在您的类中声明virtual方法,则继承类无法为来自该基类的任何方法提供任何virtual覆盖。最好首先从语义上说明这一点是classFoo{public:Foo

c++ - 从 std::true_type 继承 vs static constexpr const bool 成员

我知道这不是一个非常尖锐的问题。使用一个比另一个有优势(编译时间、依赖性、调试符号大小、可用性、可读性等)吗?templatestructIsSharedPtr:std::false_type{};对比templatestructIsSharedPtr{staticconstexprboolvalue=false;};相关问题...templatestructS;templatestructS{};templatestructS{};对比templatestructS;templatestructS{};templatestructS{}; 最佳答案

c++ - 从它的另一个专业继承的模板可以是循环依赖还是 clang 的错误

考虑下面的代码:#include#include#includetemplatestructassign;templatestructassign,std::index_sequence>:assign,std::index_sequence>...{templateassign(TargetTuple&target,constSourceTuple&source):assign,std::index_sequence>(target,source)...{}};templatestructassign,std::index_sequence>{templateassign(Targe

C++ 私有(private)继承和静态成员/类型

我试图阻止一个类将它的“this”指针转换成它的接口(interface)之一的指针。我通过中间代理类使用私有(private)继承来做到这一点。问题是我发现私有(private)继承使得层次结构中继承类下的所有类都无法访问基类的所有公共(public)静态成员和类型。classBase{public:enumEnum{value};};classMiddle:privateBase{};classChild:publicMiddle{public:voidMethod(){Base::Enume=Base::value;//doesn'tcompileBAD!Base*base=th

C++通过继承在具有 protected 构造函数的基类堆上分配对象

我有一个带有protected构造函数的类:classB{protected:B(){};};现在我从它派生并定义了两个静态函数,我设法实际创建类B的对象,但不是在堆上:classA:publicB{public:staticBcreateOnStack(){returnB();}//staticB*createOnHeap(){returnnewB;}//CompiletimeErroronVS2010};Bb=A::createOnStack();//ThisworksonVS2010!问题是:1)VS2010允许第一种情况是错误的吗?2)是否可以在不以任何方式修改B的情况下创建B

c++ - C++中的类接口(interface)继承

我有以下情况,图为我的类的理论继承图:基本思路是1)有两个可以在不同平台上实现的抽象基类(在我的例子中是两个不同的操作系统)2)允许BBase向上转换为ABase以便有时能够平等地处理这两种类型(例如,将两种类型的实例保存在一个列表中)。3)在ABase和BBase中实现某些通用功能。现在,用C++表示它的最佳方式是什么?尽管它确实支持多重继承,但据我所知,像这样的多级继承是不可能的。问题是B继承自A和BBase,而后者又继承自ABase。只需将此1:1(以下代码)翻译成C++,C++编译器(GNU)就会提示ABase::foo()未在B中实现。classABase{public:vi

从抽象类Java继承后的访问属性

我无法访问从抽象类继承的混凝土类型的类的字段。在Java中,我创建了一个扩展学生的外部学生*/publicclassExternalStudentextendsStudent{StringcurrentSchool;publicExternalStudent(Stringname,Integerage,StringstudentIdentifier,StringcurrentSchool){super(name,age,studentIdentifier);this.currentSchool=currentSchool;}}学生在哪里publicabstractclassStudent{//

c# - C++/CLI 使用抽象方法从 native C++ 类继承并将其公开给 C#

我一直在谷歌上四处搜索,试图找到一个完整的例子,但无济于事。我有一个C++API,它提供了许多类,这些类包含供开发人员扩展的纯虚拟方法。我试图做的是通过C++/CLI向C#提供此接口(interface)。我已经设法将API编译到C++/CLI库中,但由于我是新手,所以遇到了困难。我知道我需要创建一个包装器来将C++/CLI非托管类暴露给托管.net类,但我还没有找到一个可靠的示例或讨论来说明如何使用抽象的C++执行此操作类(class)。任何人都可以为我指出正确的方向吗?一个完整的示例包括C#测试应用程序,它显示了如何为抽象类创建包装器的端到端。它似乎是一个“哦,你只是做X”的事情,

c++ - 反汇编多重继承中的虚拟方法。 vtable 是如何工作的?

假设以下C++源文件:#includeclassBaseTest{public:inta;BaseTest():a(2){}virtualintgB(){returna;};};classSubTest:publicBaseTest{public:intb;SubTest():b(4){}};classTriTest:publicBaseTest{public:intc;TriTest():c(42){}};classEvilTest:publicSubTest,publicTriTest{public:virtualintgB(){returnb;}};intmain(){EvilT

c++ - 如何规避 Intel C++ 编译器的 `decltype` 和继承问题?

我今天非常惊讶地发现Intel的icpc(版本14.0.2,使用std=c++0x)无法编译以下代码段。p>#includenamespacetraits_tests{templatestructsfinae_true:std::true_type{};templatestaticautovalue_type(int)->sfinae_true;templatestaticautovalue_type(void*)->std::false_type;}templatestructhas_value_type:decltype(traits_tests::value_type(0)){}