【发布时间】:2017-05-26 10:36:26
【问题描述】:
我有两个派生自同一个基类的类。在编译时,知道哪个是基于宏定义创建的。我有另一个类是用户并调用成员函数(每个类都有不同的)。它看起来像这样:
class User() {
void useClass( Base* p ) {
#ifdef useA
p->aFun();
#else
p->bFun()
#endif
}
class Base() {}
class A : public Base {
void aFun();
}
class B : public Base {
void bFun();
}
class C {
C() {
#ifdef useA
p = new A();
#else
p = new B();
#endif
}
Base* p;
User m_user;
void doStuffWithUser() {
user.useClass( p );
}
}
我想减少宏的数量,所以我想知道是否有更好的方法来做到这一点。特别是,User 类中的#ifdef 对我来说看起来不太好。有没有办法在不使用宏的情况下重现它?理想情况下不需要运行时检查来确定 p 是什么类型。
编辑: 两个派生类有不同的成员需要调用,尽管继承,但不能更改。
【问题讨论】:
-
如果您的使用仅限于您在代码中描述的内容,那么虚函数完全可以满足您的需求。
-
您可能可以提供一个CRTP 来摆脱
#ifdef的。 -
看起来像虚函数。可能还有 tagdispatch 和模板的东西
-
我编辑了问题以明确这两个类具有不同的接口。这不能改变。所以虚函数在这里不起作用
-
目前,您的代码无法编译。
标签: c++