2014-04-09 80 views
1

的目的予定义的类A,其定义一个静态功能的静电功能。比方说,如何强制派生类来实现,其接收作为参数派生

class A{ 

    // virtual functions 

    // the function create the object and sets its fields according to inputs 
    static bool create(vector<string> inputs, A* a); 

} 

是否有可能迫使派生类实现下列方式compute功能?

class B : public class A{ 

    // virtual functions 

    static bool create(vector<string> inputs, B* b); 
} 

class C : public class A{ 

    // virtual functions 

    static bool create(vector<string> inputs, C* c); 
} 
+4

听起来好像这应该是一个非静态函数,并采取只有字符串作为参数。 – Borgleader

+0

不要在'A'中定义它,在'B'上调用它。如果'print'没有在'B'中定义,你会得到一个错误。在这方面,它类似于纯粹的虚拟功能,只是它不是虚拟的。 – iavr

+0

@Borgleader对不起,我简化了很多例子。现在应该更清楚了。事实是,我想修改基于'inputs'作为参数传递的对象。我不想用构造函数来做,因为操作可能会失败。 – user3516222

回答

1

不,没有办法。 “强制”一个类实现一个函数只能通过纯虚函数来实现(并且即使这样你也不会真的强制它,因为派生类本身可以保持抽象)。

想一想。您正试图组合两种不兼容的C++机制。

virtual总是与对象有关。你有一个派生类型的对象和一个指针或对基类型的引用。虚拟功能的整个概念只有对象才有意义。

static,相反,不是需要一个对象。你首先使用static的原因恰恰是:你想调用一些东西而不需要一个对象。

所以它只是两个不同的世界,真的。你问的问题“我怎样才能让编译器在运行时选择一个函数,取决于一个对象的派生类型而不需要一个对象?”

也许你真正想要的是模板。使用模板,你可以要求一个类型,在一定的上下文中使用时,具有一定的功能:

template <class T> 
void f() 
{ 
    T::compute(my_vector); 
} 

在任何情况下,似乎你的实际目标是解决一个更高层次的问题,但你正在使用错误的工具。

+0

我可以问,如果从OP的问题中删除单词'static'会怎么样?我可以强制派生类实现一个将其类型作为参数的函数吗?使用模板似乎失去了基类的一些好处。例如。,基类函数(代码膨胀)的共享实现和接口函数的不同实现(er ...使用模板特化)? – Neo1989