Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;虚拟+;受保护的? 在C++中,我有一个基类A,一个子类B。 我想在B中重新定义'Visit',但是B需要访问每个A的'Visit'函数(以及所有子类to)_C++_Class_Virtual_Protected - Fatal编程技术网

C++;虚拟+;受保护的? 在C++中,我有一个基类A,一个子类B。 我想在B中重新定义'Visit',但是B需要访问每个A的'Visit'函数(以及所有子类to)

C++;虚拟+;受保护的? 在C++中,我有一个基类A,一个子类B。 我想在B中重新定义'Visit',但是B需要访问每个A的'Visit'函数(以及所有子类to),c++,class,virtual,protected,C++,Class,Virtual,Protected,我有类似的东西,但它告诉我B不能访问A的受保护成员!但是B也是a:-P 那么,我能做什么 class A { protected: virtual Visit(...); } class B : public class A { protected: vector<A*> childs; Visit(...); } B::Visit(...) { foreach(A* a in childs) { a->Visit(...); } } A类 { 受保护的: 虚

我有类似的东西,但它告诉我B不能访问A的受保护成员!但是B也是a:-P

那么,我能做什么

class A
{
protected:
virtual Visit(...);
}

class B : public class A
{
protected:
vector<A*> childs;
Visit(...);
}

B::Visit(...)
{
 foreach(A* a in childs)
 {
   a->Visit(...);
 }
}
A类
{
受保护的:
虚拟访问(…);
}
B类:公共A类
{
受保护的:
媒介儿童;
访问(…);
}
B::访问(…)
{
foreach(儿童中的A*A)
{
a->访问(…);
}
}

Thx

您可以使用自己的对象访问受保护的成员,但您不能使用替代对象访问受保护的成员,除非它也是您的类(而不仅仅是基类)

这是一个变通办法,就像友谊没有被继承一样

在本例的任何情况下:

class A
{
protected:
  virtual void Visit(...);

  void visitOther( A& other, ... )
  {
     other.Visit(...);
  }
};



class B : public A
   {
       Visit(...);
       vector<A*> childs;
   };

   B::Visit(...)
    {
     BOOST_FOREACH( a, childs )
     {
         visitOther( *a, ... );
     }
   }
A类
{
受保护的:
虚拟虚空访问(…);
无效访问(A和其他,…)
{
其他.访问(……);
}
};
B类:公共A
{
访问(…);
媒介儿童;
};
B::访问(…)
{
每个人(一个孩子)
{
拜访者(*a,…);
}
}

在“示例”中对其进行了更正。现在B是A的子类。

只要让B成为A的朋友:

class A  
{  
protected:  
    virtual void Visit();  
    friend class B;  
}; 

class B : public A  
{  
protected:  
    virtual void Visit();  
};

虚拟函数的本质正是您要逃避的。 这里

所有
a
将调用其相应的访问功能

没有必要公开派生自,您应该使用protected

A
中,访问函数不是虚拟函数,并生成受保护的构造函数, 通过Inherinance(和friends,以及hax)限制实例化

如果你告诉我们更多的细节,我们也可以提供更多的帮助

编辑1:如果您正在玩虚拟,请不要忘记虚拟析构函数

编辑2:尝试以下操作:

foreach (A * in the Childs)
{
  a->A::Visit(...);
}

听编译器告诉你你的设计是错误的,不要再假装你知道得更多了。公开参观。更好的是,让它成为非虚拟的:

struct A { 
  void Visit() { impl_visit(); }
private:
  virtual void impl_visit();
};

struct B : A {
private:
  Vector<A*> childs;
  void impl_visit() {
    ... 
    foreach child in childs child->Visit();
    ...
  }
};
结构A{ 无效访问(){impl_Visit();} 私人: 虚拟void impl_visit(); }; 结构B:A{ 私人: 媒介儿童; 无效执行访问(){ ... 在child的child->Visit()中为每个child设置foreach; ... } }; 哦,当你在这里的时候,请委员会添加漂亮的“foreach/in”语法。
(我是认真的,他们正在寻找让C++更容易使用的方法!)

我从你的代码中看不到B是A.的一个子类。你确定你正在编写C++吗?在C++中,没有前缀关键字。什么是<代码>前段(儿童中的A*A)< /代码>?您的代码中是否有一些宏没有告诉我们。@Charles这是伪代码,正如访问必须返回某些内容,您不能只是传递…@CashCow:谢谢,下次我会更直接。是的,我考虑过将其设为静态。-1破坏封装,如果我也有一个从a派生的C,有同样的问题怎么办?“朋友”关键字存在,所以当您知道自己在做什么时使用它也不错:这里没有提到类C,那么您想让场景复杂化些什么呢?
struct A { 
  void Visit() { impl_visit(); }
private:
  virtual void impl_visit();
};

struct B : A {
private:
  Vector<A*> childs;
  void impl_visit() {
    ... 
    foreach child in childs child->Visit();
    ...
  }
};