Polymoprhism - 基类私有成员的子类共享
Polymoprhism - subclasses sharing of baseclass private members
为什么子类不使用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
这是错误的。 a
和b
是不同的对象。它们每个都有一个 A
子对象的实例。您没有在 b
中设置cnt
,因此查看它会给您一个垃圾值也就不足为奇了,因为从未初始化的对象读取是未定义的行为。
如果我希望子类共享同一个私有成员,会是什么样子?
可以为基类指定一个static
数据成员。这意味着A
的所有实例将共享同一个成员。
为什么子类不使用多调主义在超类中共享相同的私有成员变量?
多态性与数据嵌入类的方式无关;(运行时)多态性仅与dynamic_cast
和type_info
的virtual
调度和运行时类型信息 (RTTI) 相关。
如果您想象堆栈上的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',可以选择将我自己的数据成员附加到Super
中的数据成员,可能会添加更多功能/覆盖virtual
功能"。
基类只有一个实例,如果
SubA
通过突变器设置私有成员 - 那么为什么SubB
无法访问此值。
这是错误的...每个子类都嵌入了自己的超类实例。
如果我希望子类共享同一个私有成员,会是什么样子?
嗯,有很多方法可以协调它:
你可以让子类保存指向一个
Data
对象的指针,你将要共享的超类的数据移动到该对象中,然后你需要一种方法来初始化Data
对象,并让所有要共享它的子类实例都知道它。你可以将超类数据设为
static
,这意味着每个static
变量的单个副本将由超类的所有实例共享,无论是否嵌入在子类中。
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- C++子类共享变量?
- 跨子类的共享指针
- 共享库中非模板基的模板子类导致未定义的符号类型信息'class'链接错误
- 多个小型函子类的共享头文件
- 如何让一组不同的子类对象从另一组共享基类的一个静态变量
- 子类是否共享C++父类的静态变量
- c++虚方法:必须在父类中为父类和子类不共享的每个方法创建一个虚方法吗?
- 从共享库加载方法,该方法调用在子类中实现的方法
- 使用-fno-rtti编译的共享库中的子类
- Polymoprhism - 基类私有成员的子类共享
- 共享父类成员的子类