0

有一个用例

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) { ..}
}

从设计的角度来看,在抽象类中使方法非静态或使派生类具有静态方法是一种好方法。

4

3 回答 3

3

您可以使析构函数成为纯虚函数:

类富 {
  上市:
    虚拟〜foo()= 0;
}

无论如何,您只需要确保为析构函数提供实现:

foo::~foo() {}

编辑:
因此你有一个可以派生的类,但它本身不能被实例化。

于 2008-12-24T08:19:17.800 回答
1

其他人发布的问题是该方法应该是虚拟的还是静态的。

多态性是基于这样的想法,即您调用特定对象实例的行为,而不管您对它有什么类型的引用。

base& somefunction(); // may return base or derived objects
base &b = somefunction();
b.method();

现在,如果方法行为从基础变为派生,并且您想要您所指的真实实例的行为,那么您需要多态性,因此需要一个虚拟方法。该方法可能使用或不使用成员数据这一事实无关紧要,重要的是它是绑定到特定实例的行为。

另一方面,静态方法绑定到类。也就是说,它是您正在处理的类的行为,而不是被引用的实例的行为。因此,即使可以使用上面的语法,它也会调用类基中的静态方法,因为这是您正在处理的类。

如果没有更深入的领域知识,没有理由确定您正在处理的任何设计选项比另一个更好。我希望上面的推理能帮助你做出决定。

于 2008-12-24T09:57:06.680 回答
0

将静态函数包装在非静态虚函数中允许多态性,当你有实例时允许静态调用(我想不出任何用例,当你还没有实例时你只需要多态性)实例)。如果您忘记将静态虚拟的实现放在派生类中,您会丢失编译时错误,它不是很漂亮,但您无能为力。遗憾的是,这种疏忽没有在 C0x 标准中得到修复,但它是相对狭窄的要求,所以我想没有需求

于 2008-12-24T12:47:18.960 回答