C++ 如果在父类上设置了某些条件,如何不重写某些成员变量?
我有C类,它有一些变量,存在于父类B上 在正常情况下,我必须重写子类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; }
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);
}
通过这种方式,派生类具有它们所需的私有数据成员,并且您可以有条件地构造派生类型,而不是基类型
不确定这是否满足您的需要,但底线是:应该为派生类型保留数据成员;而且这些数据成员应该是私有的。基类应该作为接口,如果您觉得需要开始将函数实现放在基类中,那么您应该以另一种方式运行基类