如何从基类 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()
virtual
和override
?
提示: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++ 访问派生数据的主要内容,如果未能解决你的问题,请参考以下文章