C++ 只有在引用基类时才能调用的方法?C++;
假设我有一个抽象类C++ 只有在引用基类时才能调用的方法?C++;,c++,abstract-class,C++,Abstract Class,假设我有一个抽象类 class NecessaryDanger { public: virtual void doSomethingDangerous() =0; } 以及从该类派生的类: class DoesOtherStuff : public NecessaryDanger { //stuff void otherMethod(); void doSomethingDangerous(); } 有没有一种方法我只能允许访问doSomethingD
class NecessaryDanger
{
public:
virtual void doSomethingDangerous() =0;
}
以及从该类派生的类:
class DoesOtherStuff : public NecessaryDanger
{
//stuff
void otherMethod();
void doSomethingDangerous();
}
有没有一种方法我只能允许访问doSomethingDangerous()之类的内容
<>我还不太擅长C++,所以上面的代码可能不太正确,但你可能会明白。我有一组类,它们需要有能力做“危险的事情”(以它们自己的特殊方式),如果这些类中的多个对象做了这种危险的事情,它们可能会导致问题。我希望有一个只指向一个对象的必需危险指针的管理器类。如果doSomethingDangerous方法只能由NeedessaryDanger对象调用,那么发生对doSomethingDangerous的意外调用会更加困难,并且会让我头疼
提前谢谢你的帮助。如果这是一个愚蠢的问题,请提前道歉 当然。只需在派生类中将其设置为
private
,在基类中将其设置为public
当然,如果NecessaryDanger
是公共基地,那么任何人都可以施放和呼叫。您可能希望将其设置为私人基地,并使用friend
class DoesOtherStuff : private NecessaryDanger
{
//stuff
void otherMethod();
private:
void doSomethingDangerous();
friend class DangerManager;
}
删除超类中的
虚拟
分类器,以便编译器基于变量类型进行编译时绑定,而不是基于对象类型进行运行时绑定。基于Potatswatter的响应:)
赫伯的建议:(特别是1和2)是否适用于这种情况
准则#1:更愿意
使用模板的非虚拟接口
方法。准则#2:更愿意 虚拟函数专用。
准则#3:仅当派生类需要调用 虚拟功能,使虚拟 功能受保护 对于析构函数的特殊情况 仅: 准则#4:基类析构函数 应该是公开的和虚拟的, 或者是受保护的和非虚拟的
你能解释一下我将如何和朋友一起做这件事吗?我是否要使派生自类派生的基类:private base,使危险的方法私有,并将基类声明为friend?为什么让基地私有化会阻止铸造?谢谢你的代码样本。这与您描述的非常相似,但要让manager类成为朋友:您希望它能够完全访问
私有
内容。将基础设置为私有可以防止对基础进行强制转换,因为当某个内容是私有的时,除类本身和它的朋友外,没有任何东西可以告诉它存在。谢谢您的编辑!但这不允许我在DangerManager中的任何位置为任何对象调用此方法吗?如果我以后需要在其他上下文中从DangerManager之外的某个地方调用doSomethingDangerous,该怎么办?我仍然会从内部称之为危险管理器,比如doesotherstaff d=doesotherstaff();d、 危险剂量;正确的?有没有一种方法我只能称之为必要的危险*n;n->dosomethingdangerious()?谢谢你的支持。@Johnny:DangerManager的存在是为了调用这个方法,所以它应该有访问权限,对吗?DangerManager可以使用直接对象或基指针以任意方式调用它。不要担心它有太多的访问权限。C++权限系统的设计是为了强烈地阻止用户访问实现,它不是安全措施或者是实现中的超精密工具。我想我会在基础中的派生和公开中使其私有化。否则我就不能称之为必要的危险,这才是我真正想要的。我只是希望对这个函数的调用是显而易见的,而且很难意外地执行(比如当循环通过这个管理器将管理的所有对象时)。非常感谢您的帮助!消除virtual
如何解决问题?这更有可能破坏一切。对NecessaryDanger
变量调用doSomethingDangerous()
将调用NecessaryDanger::doSomethingDangerous
,而不管变量中包含的对象是什么类型。删除virtual
会破坏该方法的多态性,而这正是提问者想要的。他是如何表示他不想要多态性的?更重要的是,当他特别想通过基指针进行访问时,为什么建议从基类中删除virtual
,而不是从派生类中删除实现。
class DoesOtherStuff : private NecessaryDanger
{
//stuff
void otherMethod();
private:
void doSomethingDangerous();
friend class DangerManager;
}