【发布时间】:2013-03-26 18:15:14
【问题描述】:
在头文件.hpp中:
class Base{
public:
static /*Some Return Type*/ func(/*Some Datatype*/);
}
class Derived1 public Base{
public:
Derived1();
~Derived1();
}
class Derived1 public Base{
public:
Derived2();
~Derived2();
}
在cpp文件.cpp中:
/*Some Return Type*/ Derived1::func(/*Some Datatype*/){
}
/*Some Return Type*/ Derived2::func(/*Some Datatype*/){
}
这显然失败了,因为没有办法覆盖子类中的静态方法。但是如何获得上述功能呢?
我必须这样称呼:
/*Some Return Type*/ result = Derived1::func(/*Some Datatype*/)
/*Some Return Type*/ result = Derived2::func(/*Some Datatype*/)
我知道,抽象方法可以像下面这样在基类中定义,然后在派生类中定义:
在头文件.hpp中:
class Base{
public:
virtual /*Some Return Type*/ func(/*Some Datatype*/) const = 0;
}
但问题是虚方法需要对象实例化,这不是我想要的。我想在不创建对象的情况下调用该方法。如果允许使用虚拟静态方法,它们就可以达到目的。
我能想到的唯一选择是在头文件的所有派生类中声明函数func(),并将其从基类中删除。有没有其他方法可以做到这一点?这样声明在 Base 类中只有一次,所有 Derived 类只需要定义它们,而不需要重新声明?
【问题讨论】:
-
如果您有两个类
B和C,每个类都派生A并覆盖A上相同的理论“静态虚拟”方法,当您调用该方法时会发生什么A?应该使用B或C的实现吗? -
请说明你想如何调用这个函数,并说明应该选择哪个版本。
-
是的,我看不出原因。您自己说过:“虚拟方法需要对象实例化”。当你调用一个静态成员函数时,你总是给它所属的类。
-
其实
A是我的抽象类。而且我永远不会在A上调用该方法。没想到这个案子。现在我明白为什么不允许使用静态虚拟了,但是我该如何实现我的功能呢?除了在每个派生类中声明相同的函数之外,没有别的办法吗? -
@NehalJ.Wani 如果你永远不会在
A上调用该函数,那么在A上声明它是没有意义的。
标签: c++ oop inheritance static-methods virtual-functions