【问题标题】:How to access derived data from base class C++如何从基类 C++ 访问派生数据
【发布时间】:2020-01-18 16:15:59
【问题描述】:

B类:我在我的项目中处于这种类型的场景中,我在x()baseclass A的函数中,需要从派生的class C访问数据y。 我已经声明了派生class C 的对象并使用obj_c 我得到了x() 函数

class A
{
private :
    public :
    //.....
    void x()
    {
        cout << y ;
    }
    //.....
};

class B : public A
{
public :
    //.....
protected :
    //.....
private :
    //.....

};
class C : public B
{
public :
    //.....
protected :
    int y = 10 ;
private :

    //.....

};
int main()
{
    C obj_c ;
    obj_c.x();
}


【问题讨论】:

  • 如果没有一些奇怪的技巧,你就无法做到这一点。为什么不在C 中制作x() virtualoverride
  • 提示:virtual.
  • "我在基类 A 的 x() 函数中,需要访问派生类 C 中的数据 y。" 这在术语上是矛盾的。 A 甚至不知道C 是否存在。它也不知道当前的A 是否实际上是C。只有C 知道它是C
  • 如果有人写B obj_b; obj_b.x();,你想怎么办?

标签: c++ class oop inheritance


【解决方案1】:

将 y 的声明放在基类中。毕竟,按照您编写代码的方式,A 需要包含一个 y 才能起作用。

然后,派生类可以通过在构造时将值传递给 A 来分配值。

class A {
public:
   void x() { cout << y; };

protected:
   A(int value) : y(value) {} 
   int y;
}

class B : public A
{
protected:
    B(int value) : A(value) {}
}

class C : public B
{
public:
    C() : B(10) {}
}

【讨论】:

    【解决方案2】:

    由于 C 继承于 B 并且 B 继承于 A,因此在类中将函数设为虚拟。用C实现,直接调用。

    【讨论】:

      【解决方案3】:

      基类的想法是即使C 不存在,也可以使用A。那么A 会在哪里得到y

      您在这些情况下所做的是Template Method 设计模式:

      A 假设继承类将通过要求它们实现 get_y() 方法来提供 y

      #include <iostream>
      
      class A
      {
          private :
          protected:
              virtual int get_y() = 0;
          public :
              //.....
              void x()
              {
                  std::cout << get_y() << std::endl;
              }
              //.....
      };
      
      class B : public A
      {
          public :
              //.....
          protected :
              //.....
          private :
              //.....
      
      };
      class C : public B
      {
          public :
              //.....
          protected :
              int get_y()
              {
                  return 10;
              }
          private :
      
              //.....
      
      };
      int main()
      {
          C obj_c ;
          obj_c.x();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-21
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 2011-12-07
        • 1970-01-01
        • 2015-05-23
        • 1970-01-01
        相关资源
        最近更新 更多