C++子类共享变量?
C++ Sub Classes Share Variable?
菜鸟到C++。我在C++玩继承时反驳了一个奇怪的问题。我有一个父类和 2 个继承父类的子类。
#include <iostream>
#include <memory>
class Parent {
public:
Parent() {}
};
class Child1: public Parent {
public:
int param1;
Child1(int param): Parent() {
param1 = param;
}
};
class Child2: public Parent {
public:
int param2;
Child2(int param): Parent() {
param2 = param;
}
};
int main() {
std::shared_ptr<Parent> obj = std::make_shared<Child1>(123);
std::cout << std::static_pointer_cast<Child2>(obj)->param2 << std::endl;
// output 123 and no run time error, wut?
return 0;
}
如您所见,尽管obj
是用Child1
的构造函数初始化的,但它仍然可以设置为Child2
。事件param2
的值与param1
相同。
这是怎么回事?这种行为有术语吗?这对shared_ptr
来说很特别吗?
多谢!
根据 [util.smartptr.shared.cast],std::static_pointer_cast
返回:
shared_ptr<T>(r, static_cast<typename shared_ptr<T>::element_type*>(r.get()))
这意味着,实际上,您正在执行从Parent *
到Child2 *
的static_cast
。那很好。
但是,在这种情况下,您要转换的对象obj
具有运行时类型Child1 *
,因此根据 [expr.static.cast]p11,您最终会得到未定义的行为:
可以转换为类型为"指向 cv2 D 的指针"的 prvalue,其中 D 是从 B 派生的类,如果 cv2 与 cv1 具有相同的 cv 限定条件,或者比 cv1 具有更高的 cv 限定条件。(...)如果类型为"指向 cv1 B 的指针"的 prvalue 指向实际上是 D 类型对象的子对象的B,则生成的指针指向 D 类型的封闭对象。否则,行为是未定义的。
相关文章:
- C++子类共享变量?
- 如何在C++子类中访问父类的私有变量
- 如何在C++中找到变量派生最多的子类?
- 如何访问基类向量中的子类变量?(对于实体组件系统)
- 构造添加了成员变量的子类
- 将子类实例保存在父类型变量中并通过父变量使用 Child 函数?
- 重写子类构造函数中的父类变量
- 无法使用子类变量访问超类公共成员
- 共享指针中的递归,而变量在类中定义
- 跨子类的共享指针
- 如何将我的 cli 信息(变量等)共享到子进程,这是一个 bash shell 脚本
- 如何在 getter 的父类中初始化变量的情况下访问子类中的变量
- 共享库中非模板基的模板子类导致未定义的符号类型信息'class'链接错误
- 尝试为所有子类 B 编辑父类 A 类的静态变量
- 有没有更好的方法可以从子类访问父类的变量?
- 在派生类之间复制共享变量(浅副本就足够了)
- 如何以相同的方法在子类中超载的相同方法来实现工作变量参数方法
- C++:使用父类运算符函数更新子类对象的继承变量
- 如何让一组不同的子类对象从另一组共享基类的一个静态变量
- 子类是否共享C++父类的静态变量