C ++子类共享变量吗?

时间:2018-10-21 05:43:30

标签: c++

从Noob到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设置大小写。事件param2param1具有相同的值。

这是怎么回事?有这种行为的术语吗?这对shared_ptr来说特别吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

根据[util.smartptr.shared.cast],std::static_pointer_cast返回:

shared_ptr<T>(r, static_cast<typename shared_ptr<T>::element_type*>(r.get()))

这意味着,实际上,您正在执行从static_castParent *的{​​{1}}。很好。

但是,根据[expr.static.cast] p11,在这种情况下,您要投射的对象Child2 *的运行时类型为objso you end up with undefined behavior

  

“指针指向cv1 B”类型的prvalue(其中B是类类型)可以转换为“指针指向cv2 D”的prvalue,其中D是从B派生的类(如果cv2相同) cv资格等于或大于cv1。 (...)如果类型“指向cv1 B的指针”的prvalue指向实际上是类型D的对象的子对象的B,则生成的指针指向类型D的封闭对象。否则,行为是不确定的。