草庐IT

c++ - 基类中的公共(public) protected 数据成员?

我有一个基类和几个派生类。派生类使用一些公共(public)数据,我可以把这些公共(public)数据作为基类的保护成员吗?我知道protected成员有时会破坏封装,所以我想知道是否有什么好的方法。这是一个具体的例子:classBase{public:virtualvoidfoo()=0;voidprintData();protected:std::vectormData;}classDr1:publicBase{public:virtualvoidfoo();//couldchangemData}classDr2:publicBase{public:virtualvoidfoo()

c++ - 实现基类比较的正确方法是什么?

我有一个基类classAnimal具有纯虚函数和一组派生类classMonkey:publicAnimalclassSnake:publicAnimal我想实现一个比较操作,这样,如果我在我的代码中遇到两个指向Animals的指针Animal*animal1Animal*animal2我可以将它们相互比较。如果animal1和animal2属于不同的派生类,比较结果应该是false。如果它们属于同一个派生类,则应返回比较运算符的输出。有人能告诉我实现这个的好方法吗? 最佳答案 哇,很多其他答案完全没有必要。dynamic_cast-

c++ - 如果基类有两个同名函数,则找不到基类函数

我有一个基类,它有两个同名但在2级继承中具有不同签名的函数。structA{virtualvoidf(int){}virtualvoidf(int,int){};virtualvoidf1(int){}};structB:publicA{};structC:publicB{voidf(int,int){}voidf1(int){}};intmain(){Cobj;obj.f1(0);obj.f(0,0);obj.f(0);//(1)cannotbefoundobj.B::f(0);//(2)works}我希望我的编译器(gcc-4.3.2)在(1)找到正确的定义,但我得到了g++mai

c++ - 通过此指针调用 protected 基类方法并转换为派生类中的基类 (C++)

首先,我了解C++标准(ISO/IEC14882:2003):第11.5节第1段,但事实并非如此(但编译器显然不这么认为)。我尝试通过this指针在派生类方法中调用protected基类方法,静态转换为基类指针并在MSVC2008错误C2248:'A::f'中:无法访问类“A”中声明的protected成员。我必须在“奇怪的重复模板模式”的上下文中执行此操作,但我可以用更简单的代码重现此错误,如下所示:classB{protected:voidf(){}};classD:publicB{public:voidg(){f();//okthis->f();//okstatic_cast(t

c++ - 为什么当我抛出派生类的对象时,基类的 catch block 会捕获异常?

这个问题在这里已经有了答案:WhyBaseClasscatchblockcatchderivedclassobject?(3个答案)Whythrowatderivedclasscatchesbybase?(5个答案)关闭5年前。如果我正在传递派生类的对象,那么应该调用派生类的catchblock。但是输出显示异常被基类捕获。为什么?#includeusingnamespacestd;classBase{};classDerived:publicBase{};intmain(){Derivedd;//someotherstufftry{//Somemonitoredcodethrowd;

C++:使用计算参数调用基类构造函数

这个简单的例子演示了调用基类构造函数的C++语法——据我作为C++学习者的理解:classBaseClass{protected:inti;public:BaseClass(intx){i=x;}};classDerivedClass:publicBaseClass{intj;public:DerivedClass(intx,inty):BaseClass(y){j=x;}在这里,基类构造函数可以将命名参数作为派生类构造函数的输入。现在,如果我想用一个不是直接输入到DerivedClass()的输入值调用BaseClass()构造函数怎么办?基本上,我想在DerivedClass()中

c++ - 迭代可变参数模板类的基类

如何遍历可变参数模板类的所有基类并为每个基类调用一个函数。这是一个最小的例子:structA{voidfoo(){std::coutstructX:publicU...{voidfoo(){static_cast(this)->foo()...;//???shouldcall`foo`forall`U`}};intmain(){Xx;x.foo();} 最佳答案 你通常不能没有C++17的折叠表达式。那里的省略号无效,星号后面的省略号将创建一个指针模板参数列表。对于要重复的适当模式,省略号必须位于语句的末尾,这在这里不起作用。我找到

c++ - std::unique_ptr 编译器错误:派生类的成员无法访问基类的私有(private)成员

我得到CompilerErrorC2248当我尝试编译以下代码时:#include#includeusingnamespacestd;classdata{public:staticdataparse(){datad;data::parse(d);returnd;}list>l;private:staticvoidparse(data&node){}};intmain(){return0;}为什么?我该如何解决这个问题?注意:我使用std::shared_ptr而不是std::unique_ptr没有问题。 最佳答案 您需要为您的类型

c++ - 防止继承类覆盖基类的虚函数

这个问题在这里已经有了答案:Isthereawaytopreventamethodfrombeingoverriddeninsubclasses?(14个答案)关闭7年前。情况是这样的。classInterface{public:virtualvoidfoo()=0;}classMyClass:Interface{public:virtualvoidbar()=0;private:voidfoo(){//Someprivateworkandchecks.bar();};}我希望我的用户创建一个继承自MyClass的类,他们必须在那里实现bar()。但是我怎样才能强制他们不覆盖foo()

c++ - 如何子类化模板化基类?

我有以下数据结构:structfastEngine{...}structslowEngine{...}templateclassCar{Tengine;vectorbackupEngines;virtualvoiddrive()=0;}classFastCar:publicCar{virtualvoiddrive(){//usethevaluesof"engine"insomeway}}classSlowCar:publicCar{virtualvoiddrive(){//usethevaluesof"engine"insomeway}}Car*getCarFromCarFactory