假设我有以下类:
class Base {
virtual void func() { cout << "func base" << endl; }
};
class A : virtual public Base {
public:
virtual void func() { cout << "func A" << endl; }
};
class B : virtual public Base {
public:
virtual void func() { cout << "func B" << endl; }
};
class C : public A, public B {
C(bool is_a);
public:
virtual void func() { // Call appropriate parent's func here }
};
我的要求是当我调用C func()
时调用适当的父类'function func()
。这就是我的意思:
Base* ptr = new C(true /*is_a*/);
ptr->func(); // This should call A's func internally
如何实现这一目标?它甚至可能吗?
[编辑]
这可能更像是一个设计问题。众所周知,C类只有一个真正的父(A或B)。并且取决于哪个是父,我希望调用该函数。欢迎任何替代设计建议。
我从A和B派生C,因为有一些共同的功能,A和B共享,哪些不能成为基类的一部分。
答案 0 :(得分:6)
您需要明确调用A::func()
。
class C : public A, public B {
public:
virtual void func() { A::func(); }
};
更新(给你):
你真的想要实现什么?您想解决一个实际问题吗?
如果你知道“C类只有一个真正的父母”,为什么你需要首先从 A和B 派生出来?即使Aconcagua's answer有效,它看起来更像是一个没有在您身边正确陈述的问题的解决方法。如果您正在处理类的不同实现,您不想使用某种模式(例如bridge或strategy模式)吗?
答案 1 :(得分:3)
这可能更像是一个设计问题。众所周知,C类只有一个真正的父(A或B)。并且取决于哪个是父,我希望调用该函数。欢迎提出任何其他设计建议。
class Base { };
class A : public Base { };
class B : public Base { };
class C
{
// common interface for all types of C
};
class C_A : public A, public C { };
class C_B : public B, public C { };
现在,您可以使用C_A
,C
需要表现为A
和C_B
类似......
在上面的示例中,删除了所有虚拟继承,不需要它们。根据用例,让类C
本身从Base继承可能适合也可能不适合。如果是这样,请让所有A
,B
和C
从Base继承。但是,C_A
和C_B
不需要从父母那里继承(由于基类的虚拟继承,仍然会有一个Base
实例继承。)