C++ C++;将基类成员链接到派生类成员 B类成员{ 公众: int b_var; }; D类成员:公共B类成员{ 公众: int d_var; }; B类{ 公众: B_成员B_成员; }; D类:公共B类{ 公众: D_成员D_成员; }; int main(){ D导出; D_mem dmem; dmem.b_var=2; dmem.d_var=3; B*B_ptr=&derived; std::cout b_member.b_var;//不打印2 }

C++ C++;将基类成员链接到派生类成员 B类成员{ 公众: int b_var; }; D类成员:公共B类成员{ 公众: int d_var; }; B类{ 公众: B_成员B_成员; }; D类:公共B类{ 公众: D_成员D_成员; }; int main(){ D导出; D_mem dmem; dmem.b_var=2; dmem.d_var=3; B*B_ptr=&derived; std::cout b_member.b_var;//不打印2 },c++,inheritance,polymorphism,copy-constructor,move-constructor,C++,Inheritance,Polymorphism,Copy Constructor,Move Constructor,如何构造类,以便在设置/更新D_mem时,它自动设置/更新B_mem(如果相关)?在上面的示例中,我创建D并填充D_mem,但随后使用类型为B的指针访问D。我希望能够通过B_mem访问D中D_mem的基类成员 我想知道是否有多态性、复制构造函数或set函数可以让我在不必手动保持D_mem和B_mem一致的情况下做到这一点 std::cout b_member.b_var;//不打印2 当然不是 台词 class B_mem { public: int b_var; }; class

如何构造类,以便在设置/更新D_mem时,它自动设置/更新B_mem(如果相关)?在上面的示例中,我创建D并填充D_mem,但随后使用类型为B的指针访问D。我希望能够通过B_mem访问D中D_mem的基类成员

我想知道是否有多态性、复制构造函数或set函数可以让我在不必手动保持D_mem和B_mem一致的情况下做到这一点

std::cout b_member.b_var;//不打印2

当然不是

台词

class B_mem {
  public:
    int b_var;
};
class D_mem : public B_mem {
  public:
    int d_var;
};

class B {
  public:
    B_mem b_member;
};

class D : public B {
  public:
    D_mem d_member;
};


int main () {
    D derived;
    D_mem dmem;
    dmem.b_var = 2;
    dmem.d_var = 3;
    B* b_ptr = &derived;
    std::cout << b_ptr->b_member.b_var;  // Doesn't print 2
}
未更改
派生的
的成员变量。它们仍处于未初始化状态

您可以使用:

D_mem dmem;
dmem.b_var = 2;
dmem.d_var = 3;
输出:

#include <iostream>
#include <memory>

class B_mem {
   public:
      int b_var;
      virtual ~B_mem() {}
};

class D_mem : public B_mem {
   public:
      int d_var;
};

class B {
   protected:
      std::shared_ptr<B_mem> b_member;

   public:

      B(std::shared_ptr<B_mem> member) : b_member(member){}
      virtual ~B() {}

      virtual B_mem& getMember() = 0;

      virtual B_mem const& getMember() const = 0;
};

class D : public B {

   public:

      D() : B(std::shared_ptr<B_mem>(new D_mem)){}

      D_mem& getMember()
      {
         return *(std::dynamic_pointer_cast<D_mem>(b_member));
      }

      D_mem const& getMember() const
      {
         return *(std::dynamic_pointer_cast<D_mem>(b_member));
      }
};


int main () {
   D derived;

   derived.getMember().b_var = 2;
   derived.getMember().d_var = 3;

   B* b_ptr = &derived;
   std::cout << b_ptr->getMember().b_var << std::endl;
}

dmem
派生的.d_成员
是不同的对象。啊,是的!我想在定义
dmem
之后添加
derived.d_member=dmem
。即使进行了修复,您仍然会遇到相同的问题。
int main () {
    D derived;
    D_mem dmem;
    dmem.b_var = 2;
    dmem.d_var = 3;

    derived.d_member = dmem;   // Set the value of derived.
    derived.b_member = dmem; 

    B* b_ptr = &derived;
    std::cout << b_ptr->b_member.b_var;  // Doesn't print 2
}
#include <iostream>
#include <memory>

class B_mem {
   public:
      int b_var;
      virtual ~B_mem() {}
};

class D_mem : public B_mem {
   public:
      int d_var;
};

class B {
   protected:
      std::shared_ptr<B_mem> b_member;

   public:

      B(std::shared_ptr<B_mem> member) : b_member(member){}
      virtual ~B() {}

      virtual B_mem& getMember() = 0;

      virtual B_mem const& getMember() const = 0;
};

class D : public B {

   public:

      D() : B(std::shared_ptr<B_mem>(new D_mem)){}

      D_mem& getMember()
      {
         return *(std::dynamic_pointer_cast<D_mem>(b_member));
      }

      D_mem const& getMember() const
      {
         return *(std::dynamic_pointer_cast<D_mem>(b_member));
      }
};


int main () {
   D derived;

   derived.getMember().b_var = 2;
   derived.getMember().d_var = 3;

   B* b_ptr = &derived;
   std::cout << b_ptr->getMember().b_var << std::endl;
}
2