如何从基类 C++ 访问派生数据

Posted

技术标签:

【中文标题】如何从基类 C++ 访问派生数据【英文标题】:How to access derived data from base class 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. 查看Curiously recurring template pattern。 "我在基类 A 的 x() 函数中,需要访问派生类 C 中的数据 y。" 这在术语上是矛盾的。 A 甚至不知道C 是否存在。它也不知道当前的A 是否实际上是C。只有C 知道它是C 如果有人写B obj_b; obj_b.x();,你想怎么办? 【参考方案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();

【讨论】:

以上是关于如何从基类 C++ 访问派生数据的主要内容,如果未能解决你的问题,请参考以下文章

从基类派生类中 C++ 向量的可访问性

如何使用多态性从基类访问派生类向量成员?

如何使 Python 模拟从基类派生?

如何从基类调用派生类函数?

C++派生类是不是可以从基类继承静态数据成员和静态成员函数?

c ++设计:从基类转换为派生类,没有额外的数据成员