我的继承和有问题的一样吗"diamond inheritance"
Is my inheritance the same as the problematic "diamond inheritance"
我有多个虚拟基础 classes 为我的实现创建接口 classes。然而,我希望他们都能够序列化和反序列化自己。这导致以下 ABC 继承:
假设我有 class A
允许对 class.
进行序列化和反序列化
class A{
virtual void serialize() = 0;
virtual void deserialize() = 0;
}
我有一个 class B,它添加了一些虚拟调用,但还必须能够处理它自己的序列化操作:
class B : public A {
B() : A() {
some_variable_B_is_responisble_for = 0;
}
// inherited from A
virtual void serialize() {}
virtual void deserialize() {}
virtual void Bfunction() = 0;
private:
int some_variable_B_is_responisble_for;
}
现在我有一个 class C,它同时实现了 A 和 B 的功能。采用以下模式:
A
^ ^
| |
| B
| ^
| |
C
class C : public A, public B{
C() : A(), B() {
}
virtual void serialize() {
// do my own serialize
B::serialize(); // call B's serialize
}
virtual void deserialize() {
// do my own deserialize
B::deserialize(); // call B's deserialize
}
virtual void Bfunction() {
// implement the interface
}
这行得通还是我的推理有问题?我想将序列化和反序列化委托给所有 class 实现,这样同一个基 class.
就不会有不同的表示
菱形继承之所以“成问题”,是因为初学C++的程序员还没有了解虚继承,不知道如何实现菱形。
您的继承权是那些试图继承钻石的人在不知道如何制作钻石时得到的。然而,您的遗产缺乏的是对钻石的明显需求。目前还不清楚为什么你需要第二次继承 A 。如果你继承了 B,那么你就间接继承了它的所有基础。我建议改为尝试以下操作:
class C : public B {
virtual void serialize() {
// do my own serialize
B::serialize(); // call B's serialize
}
virtual void deserialize() {
// do my own deserialize
B::deserialize(); // call B's deserialize
}
virtual void Bfunction() {
// implement the interface
}
我有多个虚拟基础 classes 为我的实现创建接口 classes。然而,我希望他们都能够序列化和反序列化自己。这导致以下 ABC 继承:
假设我有 class A
允许对 class.
class A{
virtual void serialize() = 0;
virtual void deserialize() = 0;
}
我有一个 class B,它添加了一些虚拟调用,但还必须能够处理它自己的序列化操作:
class B : public A {
B() : A() {
some_variable_B_is_responisble_for = 0;
}
// inherited from A
virtual void serialize() {}
virtual void deserialize() {}
virtual void Bfunction() = 0;
private:
int some_variable_B_is_responisble_for;
}
现在我有一个 class C,它同时实现了 A 和 B 的功能。采用以下模式:
A
^ ^
| |
| B
| ^
| |
C
class C : public A, public B{
C() : A(), B() {
}
virtual void serialize() {
// do my own serialize
B::serialize(); // call B's serialize
}
virtual void deserialize() {
// do my own deserialize
B::deserialize(); // call B's deserialize
}
virtual void Bfunction() {
// implement the interface
}
这行得通还是我的推理有问题?我想将序列化和反序列化委托给所有 class 实现,这样同一个基 class.
就不会有不同的表示菱形继承之所以“成问题”,是因为初学C++的程序员还没有了解虚继承,不知道如何实现菱形。
您的继承权是那些试图继承钻石的人在不知道如何制作钻石时得到的。然而,您的遗产缺乏的是对钻石的明显需求。目前还不清楚为什么你需要第二次继承 A 。如果你继承了 B,那么你就间接继承了它的所有基础。我建议改为尝试以下操作:
class C : public B {
virtual void serialize() {
// do my own serialize
B::serialize(); // call B's serialize
}
virtual void deserialize() {
// do my own deserialize
B::deserialize(); // call B's deserialize
}
virtual void Bfunction() {
// implement the interface
}