关于声明功能的快速提问。假设我有以下代码:
class a{
int var;
/* stuff*/
}
class b : a{
/* other stuff*/
}
class c : a{
/* more other stuff*/
}
class d{
myFunctionThatWantsTheIntNamedVar(SubClassOfClassA SomeClassUnknownAtCompileTime);
}
和myFunctionThatWantsTheIntNamedVar()就是这样,在a的基类中声明的整数(称为var)。类d中的函数可以传递给类b或类c的实例,这在编译时是未知的(仅在运行时)。
有没有办法可以简洁地声明一个可以采用b或c类并获得相同基本变量的函数?
我在同一时间所做的是在d类中声明两个方法,如下所示:
class d{
myFunctionThatWantsTheIntNamedVar(c aClassCInstance);
myFunctionThatWantsTheIntNamedVar(b aClassBInstance);
}
这很好,但是两个方法中的代码都是IDENTICAL ......从我对面向对象编程的理解来看,如果代码相同,你应该能够将它组合成一个更好的函数。
对此有何想法?只是在这里寻找最佳实践或其他建议,因为我在一家小公司工作并获得反馈有时很难。
编辑:抱歉,我的代码出错了,改成了:
myfunctionThatWantsTheInNamedVar(a aClassAInstance);
为:
myfunctionThatWantsTheInNamedVar(c aClassCInstance);
我的坏。
答案 0 :(得分:6)
提供一个公共访问器方法,允许访问变量,并确保不在类b和类c中隐藏其名称。
class a{
int var;
/* stuff*/
public:
const int& getVar() const { return var; }
int& getVar() { return var; }
};
然后在oyur函数中引用a
:
class d{
public: // you probably want a public member function
myFunctionThatWantsTheIntNamedVar(const a& theA) {
int n = theA.getVar();
}
然后,您可以使用b
或c
个实例调用它:
b b0;
c c0;
d d0;
d0.myFunctionThatWantsTheIntNamedVar(b0);
d0.myFunctionThatWantsTheIntNamedVar(c0);
请注意,在您的代码中,变量var
是私有的,以及类b
和c
中的非球面性。为此,您需要将继承公开:
class b : public a { .... };
class c : public a { .... };
答案 1 :(得分:3)
class d{
myFunctionThatWantsTheIntNamedVar(const a& anA);
}
如果你真的想要禁止a的实际实例,但是允许任何派生类,你可以使用Run Time Type Identification来抛出异常,如果它实际上是a而不是派生类。
如果你有一个没有实现的纯虚函数(但需要b和c来提供实现),那么你甚至无法实例化a,所以不需要检查。但是,只有你有理由这样做 - 我不会建议像这样的人工构造。