【发布时间】:2013-12-20 00:21:18
【问题描述】:
假设我有 3 个类:Base、A 和 B。
Base 是 A 类和 B 类的基类。
Base 有一个变量 val,A 和 B 可以访问。
在我可以通过 A 类设置 val 变量并反映在 B 类中的情况下,我如何让它工作?
例如:
我知道下面的这段代码行不通,因为我正在创建一个 a 和 b 类型的 OBJECT。
我想要做的是简单地让 a 和 b 共享同一个变量,这样每当a 对其进行操作时,它就会反映在b 中。
a aa;
b bb;
aa.SetVal(50000);
cout << aa.GetVal() << endl;
cout << bb.GetVal() << endl;
最后我希望cout 两行都打印出 50000。
编辑:A 类和 B 类将执行不同的操作,只需要能够访问/更改 base 中的 val 变量
【问题讨论】:
-
您必须了解,为
aa和bb的基类子对象分配的成员的内存位置位于不同的内存位置。共享意味着从不同的地方访问相同的内存位置,这是标准继承无法实现的,除非您选择操作静态基类成员 - 您现在可以在答案中看到后者的几个示例。问题是,这是否是正确的设计,如果您实际操作的值应该是“无实例”值。 -
我刚刚发布了我打算做的编辑。我需要 a & b 类来访问相同的变量并更改它。
-
当您说“A 类和 B 类将执行不同的操作”时,这是否意味着
A和B实际上是不相关的类型?那只是因为需要有类似的接口? -
是的,它们是不相关的类型。他们唯一需要的共同点就是访问同一个变量。
-
请看,不相关的类型应该不继承自一个常见的
Base类。继承对“is-a”关系建模——这意味着A和B将是共享公共属性的类型,因为它们是相似的。显然它们不相等,但它们都是Base。仅仅为了共享一个静态类成员而继承是不好的设计——实际上我宁愿使用一个隐藏良好的全局而不是这样的设计。
标签: c++ class inheritance polymorphism