Polymoprhism - 基类私有成员的子类共享

Polymoprhism - subclasses sharing of baseclass private members

本文关键字:子类 共享 成员 基类 Polymoprhism      更新时间:2023-10-16

为什么子类不使用polymoprhism在超类中共享相同的私有成员变量?基类只有一个实例,如果 SubA 通过突变器设置私有成员 - 那么为什么 SubB 无法访问此值。如果我希望子类共享同一个私有成员,会是什么样子?

 #include <iostream>
class Super {
   private:
     int cnt;
   public:
     int getCnt() {
        return cnt;
     }
     void setCnt(int cnt) {
        this->cnt = cnt;
     }
};
class SubA: public Super {
};
class SubB: public Super {
};
int main() {
  Super *super;
  SubA a;
  SubB b;
  super = &a;
  super->setCnt(10);
  super = &b;
  std::cout << super->getCnt() << std::endl;
  super = &a;
  std::cout << super->getCnt() << std::endl;
 return 0;
}

生产:

-8589546555 (garbage)
10

基类只有一个实例,如果子

A

这是错误的。 ab不同的对象。它们每个都有一个 A 子对象的实例。您没有在 b 中设置cnt,因此查看它会给您一个垃圾值也就不足为奇了,因为从未初始化的对象读取是未定义的行为

如果我希望子类共享同一个私有成员,会是什么样子?

可以为基类指定一个static数据成员。这意味着A的所有实例将共享同一个成员。

为什么子类不使用多调主义在超类中共享相同的私有成员变量?

多态性与数据嵌入类的方式无关;(运行时)多态性仅与dynamic_casttype_infovirtual调度和运行时类型信息 (RTTI) 相关。

如果您想象堆栈上的ab对象,它们的内存布局可以如下所示:

A:[[Super: int cnt;]A-specific fields (if there were any)]
B:[[Super: int cnt;]B-specific fields (if there were any)]

实际上,class A : public Super是在说"我可能想扩展'Super',可以选择将我自己的数据成员附加到Super中的数据成员,可能会添加更多功能/覆盖virtual功能"。

基类只有一个实例,如果SubA通过突变器设置私有成员 - 那么为什么SubB无法访问此值。

这是错误的...每个子类都嵌入了自己的超类实例。

如果我希望子类共享同一个私有成员,会是什么样子?

嗯,有很多方法可以协调它:

  • 你可以让子类保存指向一个Data对象的指针,你将要共享的超类的数据移动到该对象中,然后你需要一种方法来初始化Data对象,并让所有要共享它的子类实例都知道它。

  • 你可以将超类数据设为static,这意味着每个static变量的单个副本将由超类的所有实例共享,无论是否嵌入在子类中。