草庐IT

c++ - 对象切片时如何生成编译器警告/错误

我想知道是否可以让编译器针对以下代码发出警告/错误:注意:1.是的,这是一种糟糕的编程风格,我们应该避免这种情况——但我们正在处理遗留代码,希望编译器可以帮助我们识别这种情况。)2.我更喜欢编译器选项(VC++)来禁用或启用对象切片,如果有的话。classBase{};classDerived:publicBase{};voidFunc(Base){}//voidFunc(Derived)//{////}//mainFunc(Derived());在这里,如果我注释掉第二个函数,第一个函数将被调用-编译器(VC++和Gcc)对此感到满意。它是C++标准吗?遇到此类代码时,我可以要求编译

c++ - 有没有办法禁止我的类的子类化?

假设我有一个名为“Base”的类,以及一个名为“Derived”的类,它是Base的子类,可以访问Base的protected方法和成员。我现在要做的就是让它没有其他类可以继承Derived。在Java中,我可以通过将Derived类声明为“final”来实现这一点。有什么C++技巧可以给我同样的效果吗?(理想情况下,我想让除Derived之外的任何类都不能继承Base。我不能只将所有代码放入同一个类或使用friend关键字,因为Base和Derived都是模板化,Base的模板参数比Derived少....) 最佳答案 从C++1

c++ - 有没有办法禁止我的类的子类化?

假设我有一个名为“Base”的类,以及一个名为“Derived”的类,它是Base的子类,可以访问Base的protected方法和成员。我现在要做的就是让它没有其他类可以继承Derived。在Java中,我可以通过将Derived类声明为“final”来实现这一点。有什么C++技巧可以给我同样的效果吗?(理想情况下,我想让除Derived之外的任何类都不能继承Base。我不能只将所有代码放入同一个类或使用friend关键字,因为Base和Derived都是模板化,Base的模板参数比Derived少....) 最佳答案 从C++1

c++ - 如果对象在构造函数中抛出异常,会调用基类的析构函数吗?

如果对象在构造函数中抛出异常,会调用基类的析构函数吗? 最佳答案 如果在构造过程中抛出异常,所有之前构造的子对象都会被正确销毁。下面的程序证明基地肯定被破坏了:structBase{~Base(){std::cout输出:throwinginderivedconstructordestroyingbase(请注意,native指针的析构函数什么都不做,这就是为什么我们更喜欢RAII而不是原始指针。) 关于c++-如果对象在构造函数中抛出异常,会调用基类的析构函数吗?,我们在StackOv

c++ - 如果对象在构造函数中抛出异常,会调用基类的析构函数吗?

如果对象在构造函数中抛出异常,会调用基类的析构函数吗? 最佳答案 如果在构造过程中抛出异常,所有之前构造的子对象都会被正确销毁。下面的程序证明基地肯定被破坏了:structBase{~Base(){std::cout输出:throwinginderivedconstructordestroyingbase(请注意,native指针的析构函数什么都不做,这就是为什么我们更喜欢RAII而不是原始指针。) 关于c++-如果对象在构造函数中抛出异常,会调用基类的析构函数吗?,我们在StackOv

c++ - 为什么多态性不适用于 C++ 中的数组?

这个问题在这里已经有了答案:C++new[]intobaseclasspointercrashonarrayaccess(5个回答)关闭5年前。#includeusingnamespacestd;structBase{virtual~Base(){cout输出如下:(VisualStudio2015withClang3.8)~Base():1~Base():2~Base():-2071674928~Base():1为什么多态性不适用于C++中的数组? 最佳答案 给定,Base*p=Derived[4];C++11标准制定delete

c++ - 为什么多态性不适用于 C++ 中的数组?

这个问题在这里已经有了答案:C++new[]intobaseclasspointercrashonarrayaccess(5个回答)关闭5年前。#includeusingnamespacestd;structBase{virtual~Base(){cout输出如下:(VisualStudio2015withClang3.8)~Base():1~Base():2~Base():-2071674928~Base():1为什么多态性不适用于C++中的数组? 最佳答案 给定,Base*p=Derived[4];C++11标准制定delete

c++ - gcc和clang的重载解析差异涉及move构造函数和 'Derived(Base&&)'构造函数

GCC(用4.9测试)接受以下测试用例:structBase{};structDerived:Base{Derived();explicitDerived(constDerived&);explicitDerived(Derived&&);explicitDerived(constBase&);Derived(Base&&);};Derivedfoo(){Derivedresult;returnresult;}intmain(){Derivedresult=foo();}Clang(用3.5测试)拒绝它并显示以下错误消息:test.cpp:13:10:error:nomatchingc

c++ - gcc和clang的重载解析差异涉及move构造函数和 'Derived(Base&&)'构造函数

GCC(用4.9测试)接受以下测试用例:structBase{};structDerived:Base{Derived();explicitDerived(constDerived&);explicitDerived(Derived&&);explicitDerived(constBase&);Derived(Base&&);};Derivedfoo(){Derivedresult;returnresult;}intmain(){Derivedresult=foo();}Clang(用3.5测试)拒绝它并显示以下错误消息:test.cpp:13:10:error:nomatchingc

参数中的 C++ 协方差

我想知道为什么C++不支持像下面示例中的参数协方差,或者是否有办法实现它?classbase{public:virtualbase*func(base*ptr){returnnewbase();}};classderived:publicbase{public:virtualderived*func(derived*ptr)override{returnnewderived();}//notallowed}; 最佳答案 返回类型是允许的,因为derived继承自base,但函数参数不能工作-并非所有base实例都会derived也是