2008-12-24 67 views
0

有地方类具有静态功能进行抽象基类在C++

Class foo { 

public: 

    static std::string make(std::string a) { .. } 

} 

我想打富的抽象基类,但显然使不能在这个抽象的基地使用的情况下,由于虚拟功能无法是静态的。

像这样

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

正在在抽象类中的方法非静态的或已派生类具有静态方法从设计的角度来看一个不错的办法。

回答

3

可以使析构函数纯虚函数:

 
class foo { 
    public: 
    virtual ~foo() = 0; 
} 

你只需要确保提供反正析构函数的实现:

 
foo::~foo() {} 

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

+0

但是,这并没有帮助使静态功能虚拟... – Patrick 2008-12-24 12:48:16

1

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

多态性基于这样的想法,即您正在调用特定对象实例的行为,而不管您需要的引用类型。现在

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

,如果方法行为从基地变化衍生和你想要的真正的实例你指的行为,那么你就需要多态,因此虚拟方法。该方法可能使用或不使用成员数据的事实是无关紧要的,重要的部分是它是一种绑定到特定实例的行为。

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

没有理由确定你所处理的任何设计选项都比其他没有更深入的域知识更好的设计选项。我希望以上的推理可以帮助你做出决定。

0

将非静态虚函数中的静态函数包含在允许实例中的多态和允许静态调用时(我不能想到任何只需要多态的用例, t已经有一个实例)。如果忘记将派生类中的静态虚拟变量放入派生类中,并且它不是非常漂亮,但是您可以做的其他事情并不多,则可以减少编译时错误。这是一个遗憾,这种疏忽不是固定在C0x标准,但它是一个相对狭窄的要求,所以我猜不存在需求