【发布时间】:2016-03-04 20:48:42
【问题描述】:
假设给了我一个抽象类,
class A
{
public:
A(){};
virtual ~A(){};
virtual float func(const int in1, const int in2, const int in3) = 0;
//
// Some default useful functions
//
private:
//
// Some infrastructure code
//
};
在大多数情况下它工作得很好
class A1 : public A
{
public:
A1(){};
virtual ~A1(){};
virtual float func(const int in1, const int in2, const int in3)
{
// Do something to in1, in2, in3 to get output
}
};
但是假设对于 A20,我需要传递一个额外的参数来使函数工作,但我仍然想使用这个抽象类,因为除了这个额外的参数之外,其他一切都是相似的。我能想到的唯一方法是通过构造函数传递参数并存储副本。这种解决方法是否被视为良好做法?
class A20 : public A
{
public:
A20(const int in4) : m_in4(in4){};
virtual ~A20(){};
virtual float func(const int in1, const int in2, const int in3)
{
// Do something to in1, in2, in3, m_in4 to get output
}
private:
int m_in4;
};
如果不是最好的方法是什么?为函数复制另一个具有 4 个输入的抽象类会更好吗?还是让A20独立于A,将“一些默认有用的功能”和“一些基础设施代码”从A复制到A20中更好?
编辑:稻田的评论
【问题讨论】:
-
很难在没有上下文的情况下评论设计。如果您在构造函数中设置的额外值在对象的生命周期内保持不变,我会说没关系。
-
也许 c++ 11 虚函数重载对你有帮助? stackoverflow.com/questions/15827632/…
-
这样做完全没问题。但是在您的情况下它是否是好的设计可能真的取决于
func的含义以及该额外参数与传递的其他参数的关系。旁注:您应该使用初始化列表来设置该成员变量:A20( const int in4 ) : m_in4( in4) {} -
@PatrickH override 不能重载具有不同数量参数的虚函数,您的解决方案需要在抽象类中添加一个具有 4 个输入的非纯虚函数,对吗?
-
@user3667089 这是另一个重载纯虚函数的例子。 stackoverflow.com/questions/23955177/…我想你的A20班可以做到吗?
标签: c++ function oop constructor abstract-class