有一个用例
Class foo {
public:
static std::string make(std::string a) { .. }
}
我想让foo成为一个抽象基类,但显然make不能在这个抽象基类中,因为虚函数不能是静态的。
喜欢这个
Class foo {
public:
static virtual std::string make (std::string) = 0; //error this cannot be done
}
Class fooImpl: foo{
public:
std::string make(std::string a) { ..}
}
在抽象类中使方法非静态,或者从设计角度看,派生类是否有静态方法。
答案 0 :(得分:3)
您可以使析构函数成为纯虚函数:
class foo { public: virtual ~foo() = 0; }
您只需要确保为析构函数提供实现:
foo::~foo() {}
编辑:
因此,您有一个可以从中派生的类,但本身无法实例化。
答案 1 :(得分:1)
其他人发布的问题是该方法应该是虚拟的还是静态的。
多态性基于这样的想法,即无论您使用何种类型的引用,都要调用特定对象实例的行为。
base& somefunction(); // may return base or derived objects
base &b = somefunction();
b.method();
现在,如果方法行为从 base 更改为派生,并且您想要实例的行为你指的是,那么你需要多态,因此需要一个虚方法。该方法可能使用或不使用成员数据的事实是无关紧要的,重要的是它是一个绑定到特定实例的行为。
另一方面,静态方法绑定到类。也就是说,它正在处理的类的行为不是被引用的实例的行为。因此,即使可以使用上面的语法,它也会调用类 base 中的静态方法,因为这是您正在处理的类。
没有理由确定您正在处理的任何设计选项比没有更深入了解域的其他设计选项更好。我希望上面的推理可以帮助你做出决定。
答案 2 :(得分:0)
在非静态虚函数中使用静态函数可以在有实例时使用多态,在没有实例的情况下允许静态调用(我不能想到任何只在你不需要多态时的用例)已经有一个实例)。如果您忘记在派生类中放置静态虚拟实例,那么您将失去编译时错误,并且它不是很漂亮,但是您可以做的事情不多。遗憾的是,这种疏忽并没有在C0x标准中得到修复,但要求相对较窄,所以我猜没有需求