C++:从静态方法调用继承的静态方法
C++ : Calling inherited static method from static method
考虑以下抽象类AbstractEngine
:
class AbstractEngine {
static void init();
static std::string getName();
};
并考虑以下 2 个实现器类:
class Engine1 : public AbstractEngine {
static std::string getName();
};
class Engine2 : public AbstractEngine {
static std::string getName();
};
并且,init()
函数应根据类的类型调用正确的getName()
:
void AbstractEngine::init() {
std::cout << getName() << std::endl;
}
例如,如果我调用Engine1::init()
,我希望它调用Engine1::getName()
而不是AbstractEngine::getName()
我怎样才能真正AbstractEngine::init()
调用getName()
的正确实现?
您可以使用
CRTP,即将AbstractEngine
做一个模板类,然后在继承时,从AbstractEngine<EngineN>
继承:
template <typename T>
class AbstractEngine {
public:
static void init() {
std::cout << T::getName() << std::endl;
}
};
class Engine1 : public AbstractEngine<Engine1> {
public:
static std::string getName() { return "Engine1"; }
};
class Engine2 : public AbstractEngine<Engine2> {
public:
static std::string getName() { return "Engine2"; }
};
现场演示
如果你还需要一些动态多态行为,你可以创建一个通用的非模板基类:
class AbstractEngine {
//I assume you would have some virtual functions here
};
template <typename T>
class AbstractEngineImpl : public AbstractEngine {
public:
static void init() {
std::cout << T::getName() << std::endl;
}
};
class Engine1 : public AbstractEngineImpl<Engine1> {
public:
static std::string getName() { return "Engine1"; }
};
class Engine2 : public AbstractEngineImpl<Engine2> {
public:
static std::string getName() { return "Engine2"; }
};
getName()
方法不应是静态的。也不是init()
方法。
您正在尝试获得多态行为,但使用静态函数。这没有任何意义。根据定义,多态行为与特定的对象实例相关联 - 但静态函数没有关联的实例。
如果你想要多态行为(如你标记所建议的那样),请考虑这个重新设计:
class AbstractEngine {
virtual void init();
virtual std::string getName();
};
class Engine1 : public AbstractEngine {
std::string getName() override;
};
class Engine2 : public AbstractEngine {
std::string getName() override;
};
相关文章:
- 尝试了解在导入的静态方法上使用删除方法时的错误
- 如何通过命名空间调用非静态方法
- 如何在没有实例的情况下获取非静态方法的类型?
- 调用从模板派生的类的静态方法,而不指定模板
- 名称隐藏对静态函数继承的实例使用
- 如何在 c++ 中异步调用静态方法?
- C++ 将静态方法转换为简单方法
- 从另一个标头中的标头调用静态方法
- C++中静态方法的局部变量范围
- 如何启用使用另一个类的静态方法的模板函数的自动推导,从而消除冗长的调用方代码
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 当只有静态方法受到影响时,如何解决C++中的链接器错误?
- 静态变量在同一个翻译单元中被静态方法使用时是否保证被初始化?
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 从部分专用模板方法调用模板非静态方法
- 如何使用 c++ 在 cocos2dx 中定义非静态方法
- 使用 CRTP 进行选择性静态成员继承
- C++:从静态方法调用继承的静态方法
- std::char_traits中使用的静态方法是否是一种继承
- 使用静态方法/字段 c++ 进行继承