c++ - C++子类共享变量?
问题描述
菜鸟到 C++。在 C++ 中使用继承时,我反驳了一个奇怪的问题。我有一个父类和两个继承父类的子类。
#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()))
这意味着,实际上,您正在执行static_cast
from Parent *
to Child2 *
。那也行。
但是,根据 [expr.static.cast]p11 ,在这种情况下,您要转换的对象obj
具有运行时类型Child1 *
,因此您最终会得到未定义的行为:
“pointer to cv1 B”类型的纯右值,其中 B 是类类型,可以转换为“指向 cv2 D”类型的纯右值,其中 D 是从 B 派生的类,如果 cv2 是相同的 cv-qualification作为或比 cv1 更高的 cv 限定。(...) 如果“指向 cv1 B 的指针”类型的纯右值指向实际上是D 类型对象的子对象的 B,则生成的指针指向 D 类型的封闭对象。否则,行为未定义.
推荐阅读
- automation - Qmetry 手动和自动化测试
- python - 无限调用python类变量
- java - 为什么我不断收到 java.lang.reflect.InvocationTargetException
- java - Spring OAuth2 客户端 grant_type=password 示例
- algorithm - 查找重复字节序列的算法
- hive - 将数据提取到管道分隔文件的 Talend 作业
- android - Admob:广告显示在我的旧应用中,但不在我的新应用中
- connectycube - 阻塞端口上的 Connectycube websocket 连接
- javascript - JavaScript WEB API MutationObserver URL 更改
- java - 像 facebook messenger 这样的聊天头,带有编辑文本,但编辑文本不显示键盘