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

时间:2015-06-15 06:02:05

标签: c++ polymorphism

为什么子类不使用polymoprhism在超类中共享相同的私有成员变量?只有一个基类实例,如果SubA通过mutator设置私有成员 - 那么为什么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

2 个答案:

答案 0 :(得分:5)

  

只有一个基类实例,如果是SubA

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

  

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

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

答案 1 :(得分:1)

  

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

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

如果您想象堆栈中的type_infoa对象,其内存布局可以这样说明:

b

实际上,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个”

  

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

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

  

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

好吧,有很多方法可以协调:

  • 您可以让子类保存指向您要移动超级类数据的SubB对象的指针,然后您需要一种初始化Data对象的方法并使它为你想要共享的所有子类实例所知。

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