在多重继承中从派生的 class 函数调用适当的 parent class 函数
Calling appropriate parent class function from derived class function in multiple inheritance
假设我有以下 classes:
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()
时调用适当的 parent class' 函数 func()
。这就是我所说的适当的意思:
Base* ptr = new C(true /*is_a*/);
ptr->func(); // This should call A's func internally
如何实现?有可能吗?
[编辑]
这可能更像是一个设计问题。已知 class C 将只有一个真实的 parent (A 或 B)。根据 parent 是哪个,我希望调用该函数。欢迎任何替代设计建议。
我从 A 和 B 派生出 C,因为 A 和 B 共享一些共同的功能,并且不能成为基础的一部分 class。
您需要明确调用 A::func()
。
class C : public A, public B {
public:
virtual void func() { A::func(); }
};
更新(给你的):
你真正想要达到的目标是什么?有没有你想解决的实际问题?
如果您知道 "class C will have only one true parent",为什么您首先需要从 A 和 B 派生?即使 works, it looks more like a workaround for a problem that isn't properly stated from your side. In case you are dealing with different implementations for your class, wouldn't you want to employ some kind of pattern (like the bridge or strategy 模式)代替?
This might be more of a design question. It is known that class C will have only one true parent (either A or B). And depending on which is the parent, I want that function to be called. Any alternative design suggestions are welcome.
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
类似...
在上面的例子中,所有虚拟继承都被删除了,它们不再需要了。根据用例,让 class C
本身继承自 Base 可能合适也可能不合适。如果是这样,让所有 A
、B
和 C
都从 Base 虚拟继承。但是,C_A
和 C_B
不需要从它们的父级虚拟继承(由于基础 class 的虚拟继承,仍然只会继承一个 Base
实例es).
假设我有以下 classes:
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()
时调用适当的 parent class' 函数 func()
。这就是我所说的适当的意思:
Base* ptr = new C(true /*is_a*/);
ptr->func(); // This should call A's func internally
如何实现?有可能吗?
[编辑]
这可能更像是一个设计问题。已知 class C 将只有一个真实的 parent (A 或 B)。根据 parent 是哪个,我希望调用该函数。欢迎任何替代设计建议。
我从 A 和 B 派生出 C,因为 A 和 B 共享一些共同的功能,并且不能成为基础的一部分 class。
您需要明确调用 A::func()
。
class C : public A, public B {
public:
virtual void func() { A::func(); }
};
更新(给你的):
你真正想要达到的目标是什么?有没有你想解决的实际问题?
如果您知道 "class C will have only one true parent",为什么您首先需要从 A 和 B 派生?即使
This might be more of a design question. It is known that class C will have only one true parent (either A or B). And depending on which is the parent, I want that function to be called. Any alternative design suggestions are welcome.
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
类似...
在上面的例子中,所有虚拟继承都被删除了,它们不再需要了。根据用例,让 class C
本身继承自 Base 可能合适也可能不合适。如果是这样,让所有 A
、B
和 C
都从 Base 虚拟继承。但是,C_A
和 C_B
不需要从它们的父级虚拟继承(由于基础 class 的虚拟继承,仍然只会继承一个 Base
实例es).