我很长时间以来都在寻找干净利落的方式。在我的问题中,有3个类没有共享任何父级,但每个类都有一些同名的方法(A.doSomething,B.doSomething,C.doSomething)。因此,具有相同的函数签名,继承自A和使用方法doSomething()的D类将与从B或C继承的E“看起来相同”。
以下是我希望能够做到的草图:
class Base {
public:
void myMethod(void) { doSomething(); }
};
class Independent {
public:
doSomething();
};
clase Derived : public Base : public Independent {
(...)
};
int main(void) {
Derived *derivedObject = new Derived();
derivedObject->myMethod();
}
在这个问题中,“独立”类型的对象由我无法更改的库提供。我想定义一个基类,它使用稍后将继承的方法。我找不到使用虚拟继承执行此操作的正确方法,而不会导致模糊编译。
答案 0 :(得分:5)
template <typename D>
class Base {
public:
void myMethod(void) { static_cast<D*>(this)->doSomething(); }
};
class Independent {
public:
void doSomething();
};
clase Derived : public Base : public Independent {
/*...*/
};
int main(void) {
Derived *derivedObject = new Derived();
derivedObject->myMethod();
}
或者,您可以选择在其间放置一个中间人班级以转发到Independent
(我假设您有许多来自同一Base
和Independent
的班级,而且只是'don'我想为每个班级做这个。)
template <typename D>
class Base {
private:
virtual void doSomethingImpl();
public:
void myMethod(void) { doSomethingImpl(); }
};
class Independent {
public:
void doSomething();
};
class IndependentWrapper : public Base : public Independent {
private:
void doSomethingImpl() { Independent::doSomething(); }
};
clase Derived : public IndependentWrapper {
/*...*/
};
int main(void) {
Derived *derivedObject = new Derived();
derivedObject->myMethod();
}