Som*_*ing 0 c++ polymorphism inheritance
考虑以下抽象类AbstractEngine:
class AbstractEngine {
static void init();
static std::string getName();
};
Run Code Online (Sandbox Code Playgroud)
并考虑以下2个实现者类:
class Engine1 : public AbstractEngine {
static std::string getName();
};
class Engine2 : public AbstractEngine {
static std::string getName();
};
Run Code Online (Sandbox Code Playgroud)
并且,init()函数应该getName()根据类的类型调用正确的:
void AbstractEngine::init() {
std::cout << getName() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
例如,如果我打电话Engine1::init(),我希望它打电话Engine1::getName()而不是AbstractEngine::getName()
我怎样才能AbstractEngine::init()真正调用正确的实现getName()?
Tar*_*ama 12
您可以使用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"; }
};
Run Code Online (Sandbox Code Playgroud)
如果您还需要一些动态多态行为,则可以创建一个通用的非模板基类:
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"; }
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1179 次 |
| 最近记录: |