覆盖另一个类中的虚拟方法以在c ++中访问其成员

Posted

技术标签:

【中文标题】覆盖另一个类中的虚拟方法以在c ++中访问其成员【英文标题】:Overriding virtual method inside another class to access its member in c++ 【发布时间】:2018-06-20 09:17:47 【问题描述】:

假设我有两个班级 A 和 B。 A 类是 X 的子类,具有称为 now_do() 的虚拟方法,因此我可以轻松地用 A 类覆盖它。但是大多数问题都在 B 类中,所以我想在 B 中包含 A 类并将 now_do() 覆盖为 A::now_do()...但这是不可能的,那么我该怎么做才能在A::now_do()中使用B类的变量。

代码示例(B 类):

#include "A.cpp"

class B
 public:
 int a;
 //....
 void A::now_do()
  cout<<a<<endl;    //Access a member of this class B.
 

;

//But it works when I put outside B class
//However now I can't access members of class B.
void A::now_do()
  cout<<a<<endl;    //Can't access a member of this class B.

我得到的错误是:你不能在 B 中定义成员函数 A::now_do()。

【问题讨论】:

您是否在 A 类中将 now_do 声明为 virtual。 void A::now_do() 在类/命名空间 A 中定义了一个函数 now_do。你已经把它放在了 B 的声明中。去掉 A:: 使其成为 B 的函数跨度> int aB 的公共成员,因此可以从任何地方访问。 B 不继承自 XA @UKMonkey,请注意,B 不是 A 的子类,我只想在 B 中使用 A 的虚方法。 【参考方案1】:

确实,您无法在 C++ 中做您尝试做的事情(我认为也不能使用任何其他语言):您看,A 类和 B 类不共享实例信息。当您实例化 A 时,没有可以从中获取 a 值的 B 的关联实例。您也不能将您的 a 从 B 实例“粘贴”到 A 实例中。

如果您想关联 A 和 B 的实例,您可能需要:

    有一个

    class AWithB  A instance_of_A; B instance_of_B; ;
    

    (这当然不是一个好的名字选择......)

    now_do() 设为AWithB 的方法,这样它就可以访问特定于A 实例和B 实例的信息

另一种选择是让类 B 继承自 A,然后它可以覆盖 now_do()

【讨论】:

好的,我会尽力去做的。

以上是关于覆盖另一个类中的虚拟方法以在c ++中访问其成员的主要内容,如果未能解决你的问题,请参考以下文章

protect的简介

如何在c#中访问另一个类中的一个类的私有函数?

C ++:如何访问另一个类中的类函数?

如何在Obj C中的另一个类中使用一个类中声明的变量

一个方法中的hashMap的值,怎么在另一个类中调用啊?

接口访问权限