基类的静态成员函数可以调用其派生类对象吗?
答案 0 :(得分:3)
将static
成员函数视为一些非成员函数。是的无论非成员函数可以做什么,static
成员函数都可以做同样的事情!
答案 1 :(得分:1)
是的,虽然有两件事需要注意。
第一个是前向引用。如果静态方法的代码在.cpp
文件中,那么您应该能够安全地#include基类和派生类头。
<Base.h>
class Base
{
protected:
Base();
public:
virtual ~Base();
static Base* Create();
};
<Derived.h>
#include "Base.h"
class Derived : public Base
{
public:
Derived(int aParameterGoesHere);
};
<Base.cpp>
#include "Base.h"
#include "Derived.h"
Base::Base() { }
Base::~Base() { }
Base* Base::Create()
{
return new Derived(42);
}
要注意的第二件事是Derived
的私人/受保护成员无法从Base
访问,除非他们被声明为Base
或Base
的虚拟成员宣布了Derived
的朋友类(考虑到紧密耦合,这不是不合理的):
<Derived.h>
#include "Base.h"
class Derived : public Base
{
friend Base;
private:
Derived(int aParameterGoesHere);
};
答案 2 :(得分:1)
不,它无法调用,因为静态成员函数没有为其分配对象,因此它没有派生类对象。
但是,您可以使用CRTP,如下所示:
template< T >
struct base
{
base()
{
T::foo(); // here calling a static method of derived class
}
virtual ~base(){}
};
struct A : base< A >
{
virtual ~A(){}
static void foo()
{
// do stuff
}
};