在Java中:classBase{publicBase(){System.out.println("Base::Base()");virt();}voidvirt(){System.out.println("Base::virt()");}}classDerivedextendsBase{publicDerived(){System.out.println("Derived::Derived()");virt();}voidvirt(){System.out.println("Derived::virt()");}}publicclassMain{publicstaticvoidmai
我使用三种不同的编译器来编译这段代码。其中之一(我最不信任的那个)警告说,Derived中的函数隐藏了Base中的函数。其他编译器(一个是VisualC++)不会发出警告。如果我启用/Wall或/W4,VisualC++甚至不会给出警告。我倾向于认为这是编译器中发出警告的错误,因为它会编译代码。如果它确实没有覆盖基本函数,那么当我创建派生模板的实例时它应该会出错。谁能确认这应该如何表现?structBase{virtualvoidFunc(floatf)=0;};templatestructDerived:Base{virtualvoidFunc(Tf){}};intmain(){De
我使用三种不同的编译器来编译这段代码。其中之一(我最不信任的那个)警告说,Derived中的函数隐藏了Base中的函数。其他编译器(一个是VisualC++)不会发出警告。如果我启用/Wall或/W4,VisualC++甚至不会给出警告。我倾向于认为这是编译器中发出警告的错误,因为它会编译代码。如果它确实没有覆盖基本函数,那么当我创建派生模板的实例时它应该会出错。谁能确认这应该如何表现?structBase{virtualvoidFunc(floatf)=0;};templatestructDerived:Base{virtualvoidFunc(Tf){}};intmain(){De
我计划创建一个接口(interface)(而不是C++中的虚拟基类),其方法采用自己类型的参数。classBase{public:virtualvoidseriousMethod(constBase&arg)=0;}然而,派生类不应接受基类类型的参数,而是派生类类型的参数。classDerived:publicBase{public:virtualvoidseriousMethod(constDerived&arg){/*...*/}}我怎么会意识到这一点?我是否必须对基类进行模板化(例如Base)还是有更清洁的解决方案? 最佳答案
我计划创建一个接口(interface)(而不是C++中的虚拟基类),其方法采用自己类型的参数。classBase{public:virtualvoidseriousMethod(constBase&arg)=0;}然而,派生类不应接受基类类型的参数,而是派生类类型的参数。classDerived:publicBase{public:virtualvoidseriousMethod(constDerived&arg){/*...*/}}我怎么会意识到这一点?我是否必须对基类进行模板化(例如Base)还是有更清洁的解决方案? 最佳答案
编辑:当我为任何感兴趣的人更改我的设计时,我会在此处放置一个github链接。背景我正在替换boost::intrusive,intrusive_set,我自己的实现是64位编译的侵入集,将3x8字节的指针填充到我的容器节点中。我的容器有2^16个节点的限制,因此我可以使用2x16位偏移序数将其降低到每个节点4字节(大小减少6倍)。在下面的示例中base是侵入集容器。derived类有std::vector>.显然,在这种间接级别下,我需要在派生中拥有一堆嵌套的typedef,我想在base中引用它们。ps,容器用于数据描述语言的AST。因此,包含的元素是小型数据类型,并且3x8字节非
编辑:当我为任何感兴趣的人更改我的设计时,我会在此处放置一个github链接。背景我正在替换boost::intrusive,intrusive_set,我自己的实现是64位编译的侵入集,将3x8字节的指针填充到我的容器节点中。我的容器有2^16个节点的限制,因此我可以使用2x16位偏移序数将其降低到每个节点4字节(大小减少6倍)。在下面的示例中base是侵入集容器。derived类有std::vector>.显然,在这种间接级别下,我需要在派生中拥有一堆嵌套的typedef,我想在base中引用它们。ps,容器用于数据描述语言的AST。因此,包含的元素是小型数据类型,并且3x8字节非
我正在尝试做类似的事情:classBase{public:Base(){cout问题是,当我需要查看Derived和MoreDerived时,我总是将Base打印到屏幕上。有没有办法让typeid以这种方式与派生类一起工作?或者除了typeid还有别的办法吗?注意:我正在向已编码的套件添加功能,因此我不想在派生类自己返回此值的基类中添加虚拟方法。另外,不用担心运行时开销,这将是调试编译开关的一部分。 最佳答案 在构造函数Base()中,对象仍然是一个“Base”实例。它将在Base()构造函数之后成为Derived实例。尝试在构造之
我正在尝试做类似的事情:classBase{public:Base(){cout问题是,当我需要查看Derived和MoreDerived时,我总是将Base打印到屏幕上。有没有办法让typeid以这种方式与派生类一起工作?或者除了typeid还有别的办法吗?注意:我正在向已编码的套件添加功能,因此我不想在派生类自己返回此值的基类中添加虚拟方法。另外,不用担心运行时开销,这将是调试编译开关的一部分。 最佳答案 在构造函数Base()中,对象仍然是一个“Base”实例。它将在Base()构造函数之后成为Derived实例。尝试在构造之
我想知道是否可以让编译器针对以下代码发出警告/错误:注意:1.是的,这是一种糟糕的编程风格,我们应该避免这种情况——但我们正在处理遗留代码,希望编译器可以帮助我们识别这种情况。)2.我更喜欢编译器选项(VC++)来禁用或启用对象切片,如果有的话。classBase{};classDerived:publicBase{};voidFunc(Base){}//voidFunc(Derived)//{////}//mainFunc(Derived());在这里,如果我注释掉第二个函数,第一个函数将被调用-编译器(VC++和Gcc)对此感到满意。它是C++标准吗?遇到此类代码时,我可以要求编译