草庐IT

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)复制构造函数。编译器必须能够复制它才能使异常处理正常工

c++ - 未调用基本复制构造函数

classBase{public:inti;Base(){cout如果我这样做派生d1;导出d2=d1;调用base的拷贝构造函数,调用derived的默认拷贝构造函数。但是如果我从派生的复制构造函数中删除注释,则不会调用基本复制构造函数。这有什么具体原因吗?提前致谢。 最佳答案 我认为您必须显式调用基本复制构造函数:Derived(Derived&d):Base(d){cout 关于c++-未调用基本复制构造函数,我们在StackOverflow上找到一个类似的问题:

C++ 以编程方式转换 : can it be done?

假设我有一个Base类和几个Derived类。有什么方法可以将对象转换为派生类之一而无需编写如下内容:stringtypename=typeid(*object).name();if(typename=="Derived1"){Derived1*d1=static_cast(object);}elseif(typename=="Derived2"){Derived2*d2=static_cast(object);}...else{...} 最佳答案 不要。阅读多态性。几乎每一种“动态转换”情况都是多态难以实现的例子。无论您在动态类型

c++ - 基类复制构造函数的可见性问题

我有一个类(暂时称它为base),它有一个protected接口(interface),包括protected构造函数等。base的一些功能|返回base的一个实例按值(value):classbase{protected:base(){}base(baseconst&other){}//line6basefoo(){baseret;returnret;}};这些函数被包装在派生类中以返回派生类型,如下所示:classderived:publicbase{private:derived(baseconst&b):base(b){}public:derived():base(){}der

c++ - gcc 4.5.1 虚拟继承问题

让我们从代码片段开始:#includestructGod{God(){_test=8;}virtual~God(){}int_test;};structBase1:publicvirtualGod{//Base1(){std::cout_test_test使用GCC4.5.1和4.6.1编译Derived类的构造函数之间的唯一区别是第一个明确说明应该调用哪个Base1构造函数。我希望main()中的两个cout都打印8。不幸的是第一个打印0!。为什么?如果我启用Base1构造函数的显式定义,它可以解决问题。如果我在派生类定义(派生类:publicA1,publicA2)中删除虚拟继承,