0

我面临一些设计问题,我想写:

class A { ... };
class B : public A { static string type_; ... };
class C : public A { static string type_; ... };
class D : public B, public C { static string type_; ... };

我认为按照 C 类的定义,我不会有任何问题.. 但是当我定义 D 类时会发生什么?由于 D 将从 B 和 C 继承,我可能会有一些模棱两可的东西。我的最终目标是在每个类 B、C 和 D 中都有一个名称相同但值不同的静态变量。那可能吗?

非常感谢提前

4

4 回答 4

3

您在这里的代码非常好。允许类定义具有他们想要的任何名称的成员,即使它们与父类中成员的名称匹配。唯一遇到麻烦的情况是,如果使用其中一个名称会导致歧义。

在您的情况下,在类、和中拥有三个static数据成员不会导致任何问题,并且每个类的实例都将与其他所有实例不同。仅仅因为它们具有相同的名称并不意味着 C++ 将它们视为覆盖;只有成员函数可以被覆盖。BCDtype_virtual

在每个类及其成员函数的上下文中,对的任何引用都name_将始终引用name_来自该类的,因为类对其任何基类都隐藏了名称,因此编译器只会查看当前类。name_在全局范围内,您可以使用它们的完全限定名称来引用字段,例如A::name_B::name_等。

更重要的是,您在这里使用的继承类型,无论是虚拟的还是非虚拟的,都无关紧要,因为这里所讨论的只是变量的命名。由于每个数据成员只有一个副本static,因此您的类是否D最终继承了两个副本A::name_无关紧要。它不能继承两个副本,因为只有一个存在。

于 2011-03-05T10:57:40.527 回答
0

如果你写type_在一个方法中D,它会解析为D's type_。如果您写A::name_or B::name_,它将解析为相应实例的type_.

另一方面,您似乎正在尝试将某种反射系统破解到 C++ 上,因为您type_在每个类中都调用了静态字段。在极少数情况下,这可能很有用,但这可能是个坏主意。

于 2011-03-05T11:31:46.837 回答
0

那里没有任何模棱两可的地方。您将能够将这两个字段称为B::type_C::type_

于 2011-03-05T10:57:47.987 回答
-1

在菱形继承中,C++ 标准提供了一种解决方案来避免模棱两可的事情。

您的类定义结构看起来像

                       A
                      /  \
                     /    \
                    /      \
                   B        C
                    \      /
                     \    /
                      \  /
                       D 

现在,当您在 B 类中继承 A 类时,请使用以下内容

class B : public virtual A

C类也一样。

因此,当任何类从 B 类和 C 类继承时,它将只有一个类 A 的实例。

D类不需要虚拟继承。它没有效果。

D 类的大小可能与以前相同,但当您创建 D 的实例时,来自 B 类和 C 类的变量访问的任何地址都将相同。

于 2011-03-05T11:11:40.463 回答