为什么子类不使用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
答案 0 :(得分:5)
只有一个基类实例,如果是SubA
那是错的。 a
和b
是不同的对象。它们每个都有一个A
子对象的实例。您尚未在cnt
中设置b
,因此查看它会给您一个垃圾值并不奇怪,因为从未初始化的对象中读取未定义的行为。
如果我希望子类共享同一个私有成员,它会是什么样子?
您可以为基类提供static
数据成员。这意味着A
的所有实例都将共享同一个成员。
答案 1 :(得分:1)
为什么子类不使用polymoprhism在超类中共享相同的私有成员变量?
多态性与数据嵌入类中的方式无关; (运行时)多态性仅与virtual
和dynamic_cast
的{{1}}调度和运行时类型信息(RTTI)相关。
如果您想象堆栈中的type_info
和a
对象,其内存布局可以这样说明:
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
变量的单个副本将由超类的所有实例共享,无论是否嵌入在子类中。