Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果在父类上设置了某些条件,如何不重写某些成员变量?_C++ - Fatal编程技术网

C++ 如果在父类上设置了某些条件,如何不重写某些成员变量?

C++ 如果在父类上设置了某些条件,如何不重写某些成员变量?,c++,C++,我有C类,它有一些变量,存在于父类B上 在正常情况下,我必须重写子类C中的一些变量 现在我的问题是如何强制子类不重写父类中的变量 class B { protected: int a; int b; }; class C: B { void somefunc() { //I have to prevent this overriding if some condition is set on class B a = 10; }

我有C类,它有一些变量,存在于父类B上

在正常情况下,我必须重写子类C中的一些变量

现在我的问题是如何强制子类不重写父类中的变量

class B
{
  protected:

   int a;
   int b;
 };

class C: B
{
   void somefunc()  
   {
      //I have to prevent this overriding if some condition is set on class B
      a = 10;
   }
};

如果要防止在派生类中重写这些变量,请将它们设置为私有并提供受保护的getter/setter函数:

class B {
protected:

   int getA() const { return a; }
   void seta(int x) {
       if(condition) {
           throw std::runtime_error("Cannot set a");
       }
       a = x;
   }

private:
   int a;
   int b;
};

如果您发现必须有条件地继承某些数据成员而不是其他数据成员,那么您可能需要重新考虑您的设计。一般来说,数据成员应该是私有的……甚至是基类的数据成员

我不知道有条件地继承数据成员的方法。您最好的选择是执行以下操作:

class B {...};
class D1 : public B { int a; ... };
class D2 : public B { int a; int b; ... };    

enum class Option { OneArg, TwoArgs };

std::unique_ptr<B> make_b(Option const opt)
{
   std::unique_ptr<B> b;
   switch(opt) {
   case(Option::OneArg):  b = std::make_unique<D1>(...some args...); break;
   case(Option::TwoArgs): b = std::make_unique<D2>(...some args...); break;
   }
   return std::move(b);
}
通过这种方式,派生类具有它们所需的私有数据成员,并且您可以有条件地构造派生类型,而不是基类型

不确定这是否满足您的需要,但底线是:应该为派生类型保留数据成员;而且这些数据成员应该是私有的。基类应该作为接口,如果您觉得需要开始将函数实现放在基类中,那么您应该以另一种方式运行基类