gpt4 book ai didi

C++ : Calling inherited static method from static method

转载 作者:太空宇宙 更新时间:2023-11-04 14:37:56 24 4
gpt4 key购买 nike

考虑以下抽象类 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::获取名称()

如何让 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"; }
};

Live Demo


如果你还需要一些动态多态行为,你可以制作一个通用的非模板基类:

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"; }
};

关于C++ : Calling inherited static method from static method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37437542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com