草庐IT

C++ 继承,隐藏的基本方法

我有一个简单的C++基类、派生类示例。//Base.hpp#pragmaonceclassBase{public:virtualfloatgetData();virtualvoidsetData(floata,floatb);virtualvoidsetData(floatd);protected:floatdata;};//Base.cpp#include"stdafx.h"#include"Base.hpp"floatBase::getData(){returndata;}voidBase::setData(floata,floatb){setData(a);}voidBase::

C++ 纯虚方法

考虑这个演示程序:#includeclassBase{public:virtualintf(int)=0;virtualintf(){returnf(0);}virtual~Base(){}};classDerived:publicBase{public:intf(inti){return(10+i);}};intmain(void){Derivedobj;printf("%d\n",obj.f(1));//Thisworks,andreturns11printf("%d\n",obj.f());//Addingthislinegivesmetheerrorlistedbelow}这给

c++ - 我如何创建一个模板是特定类型的编译时断言?

我有一个模板函数,希望在编译时确保它不会在特定类的子类型或父类(superclass)型上实例化。如果违反此规定,我如何导致C++编译器错误?classbase{};classderived:publicbase{};classlowest:publicderived{};templateboolisCorrect(constT&obj){typedeffooD;foo*def=foo::find();return(def&&def->getAnswer(object));}我希望isCorrect仅适用于derived类,但不适用于base或lowest。请注意,可能有许多其他最低类

c++ - dynamic_cast 失败

我有一个基类和一个派生类。每个类都有一个.h文件和一个.cpp文件。我在下面的代码中将基类对象动态转换为派生类:h文件:classBase{public:Base();virtual~Base();};classDerived:publicBase{public:Derived(){};voidfoo();};classAnother{public:Another(){};voidbar(Base*pointerToBaseObject);};cpp文件:Base::Base(){//dosomething....}Base::~Base(){//dosomething....}voi

C++ : Initializing base class constant static variable with different value in derived class?

我有一个带有常量静态变量a的基类A。我需要类B的实例对静态变量a具有不同的值。这怎么能实现,最好是静态初始化?classA{public:staticconstinta;};constintA::a=1;classB:publicA{//???//Howtoset*a*toavaluespecifictoinstancesofclassB?}; 最佳答案 你不能。所有派生类共享一个静态变量实例。 关于C++:Initializingbaseclassconstantstaticvaria

c++ - 一种在 C++ 中强制使用接口(interface)的方法

在C++中,假设我有一个实现接口(interface)类BaseInterface的类Derived,其中BaseInterface只有纯虚函数和一个虚析构函数:classBaseInterface{public:virtualvoiddoSomething()=0;~BaseInterface(){}};classDerived:publicBaseInterface{public:Derived(){}~Derived(){}protected:virtualvoiddoSomething();private:intx;};Derived类层次结构之外的任何类都不应直接调用Deri

c++ - 调用派生类的模板函数

我在C++中遇到一个问题,即在具有指向基类的指针时调用派生类的函数。编辑:一些答案让我引用了CRTP但我的观点是我需要一个指向“Base*”类而不是“Base*”的指针,因为我不知道当前正在处理的类型(当前实例是从某种工厂创建的).类:classBase{..templatefunc(Targ){...};};classDerived1:publicBase{...templatefunc(Targ){...};};classDerived1:publicBase{...templatefunc(Targ){...};};用法:intmain(){Base*BasePtr=newDer

c++ - 避免在构造函数中使用虚方法

假设我有以下类层次结构:classBase{virtualintGetClassID(){return0;};public:Base(){SomeSingleton.RegisterThisObject(this->GetClassID());}classDerived{virtualintGetClassID(){return1;};public:Derived():Base(){};}好吧,这一切都是从我的真实案例中简化而来的,但这就是它的一般要点。我想避免在每个派生类的构造函数中调用RegisterThisObject,因此我试图将调用移至基类的构造函数。有没有什么模式可以让我在

c++ - 为什么当派生类调用基类的纯虚函数时 g++ 不报错?

我有一个带有纯虚函数f()的类Base。另一个类Derived派生自Base。我从Derived中调用f()。使用g++,我从链接器中得到一个错误。[agnel@dookutmp]$g++pure_virtual_function_call.cpp/tmp/ccGQLHi4.o:Infunction`Derived::f()':pure_virtual_function_call.cpp:(.text._ZN7Derived1fEv[_ZN7Derived1fEv]+0x14):undefinedreferenceto`VirtualBase::f()'collect2:error:l

c++ - 避免切片异常类型 (C++)

我正在用C++为我的库设计异常层次结构。“层次结构”是从std::runtime_error派生的4个类。我想避免slicingproblem对于异常类,因此使复制构造函数受到保护。但显然gcc在抛出它们的实例时需要调用复制构造函数,因此提示protected复制构造函数。VisualC++8.0可以很好地编译相同的代码。是否有任何可移植的方法来化解异常类的切片问题?该标准是否说明了实现是否可以/应该需要要抛出的类的复制构造函数? 最佳答案 您的异常需要有一个公共(public)复制构造函数。编译器必须能够复制它才能使异常处理正常工