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;
}