假设如下:
class A{ virtual void f() = 0; };
class B{ virtual void f() = 0; };
我能否以某种方式执行以下操作?
class C : public A, public B
{
virtual void A::f(){ printf("f() from A"); }
virtual void B::f(){ printf("f() from B"); }
};
那么现在我可以做什么了???
A* pa = new C();
pa->f(); // prints f() from A;
B* pb = (B*)pa;
pb->f(); // prints f() from B;
谢谢!!!
最佳答案
第一个解决方案
这个问题提醒了“外观”设计模式。 这应该重写为:
class AC : public A
{ public: virtual void f(){ cout << "f() from A" << endl;}; };
class BC : public B ...
class C : public AC, public BC {};
其中 C 是“外观”。
所以在正确的调用语法中应该是这样的:
C* c = new C();
c->AC::f();
c->BC::f();
如果您在 AC 和 BC 之间没有任何共享限制,这应该可以完成工作,因为它没有被混淆。
第二种方案
另一种解决方案,感谢 Casey(请参阅第一条评论),是在模板中使用类 C 的前向声明,以允许调用后者定义的方法。
template <typename C>
class AC : public A {
public:
void f() { static_cast<C&>(*this).f_from_A(); }
};
template <typename C>
class BC : public B { ... };
因此实现部分可以在同一个类中完成。
class C : public AC<C>, public BC<C> {
public:
void f_from_A() { cout << "f_from_A" << endl; };
void f_from_B() ...
};
调用部分更清晰,因为它没有显示任何实现细节并且它最接近问题:
C* c = new C();
((A*) c) -> f();
((B*) c) -> f();
C 上不再有“默认”f(),可能会破坏继承的预期行为,而且更难阅读。
关于c++ - 我可以对来自不同基类的相同功能实现不同的实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20730683/