C++;虚拟+;受保护的? 在C++中,我有一个基类A,一个子类B。 我想在B中重新定义'Visit',但是B需要访问每个A的'Visit'函数(以及所有子类to)
我有类似的东西,但它告诉我B不能访问A的受保护成员!但是B也是a:-P 那么,我能做什么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类 { 受保护的: 虚
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();
...
}
};