一个只能在引用基类时调用的方法? C ++

时间:2010-08-26 05:42:00

标签: c++ abstract-class

说我有一个抽象类

class NecessaryDanger
{
public:
     virtual void doSomethingDangerous() =0;
}

以及从此类派生的类:

class DoesOtherStuff : public NecessaryDanger
{
     //stuff
     void otherMethod();
     void doSomethingDangerous();
}

有没有办法只允许访问doSomethingDangerous(),如

DoesOtherStuff d;
d = DoesOtherStuff();
d.otherMethod(); //OK
d.doSomethingDangerous(); //error

NecessaryDanger* n = &d;
n->doSomethingDangerous(); //OK

我还不擅长C ++,所以上面的代码可能不太对,但你可能会理解。我有一组类需要有能力做“危险的事情”(以他们自己的特殊方式),如果这些类的多个对象做这个危险的事情,可能会导致问题。我想有一个具有NecessaryDanger指针的经理类只指向一个对象。如果方法doSomethingDangerous只能由NecessaryDanger对象调用,那么意外调用doSomethingDangerous将会更加困难,并导致我头痛。

提前感谢您的帮助。如果这是一个愚蠢的问题,请提前抱歉!

3 个答案:

答案 0 :(得分:4)

不确定。只需在派生类中创建private,在基础中创建public

当然,如果NecessaryDanger是公共基础,那么任何人都可以投射和通话。您可能希望将其设为私有基础并使用friend

class DoesOtherStuff : private NecessaryDanger
{
     //stuff
     void otherMethod();

private:
     void doSomethingDangerous();

     friend class DangerManager;
}

答案 1 :(得分:2)

删除超类中的virtual分类器,以便编译器根据变量类型执行编译时绑定,而不是基于对象类型的运行时绑定。

答案 2 :(得分:0)

以Potatswatter的回应为基础:)

Here是赫伯的建议:(特别是1和2)适用于此背景。

  

准则#1:更喜欢制作   使用Template接口非虚拟   方法。
  准则#2:更喜欢制作   虚拟功能私人。
  准则#3:仅当派生类需要调用a的基本实现时   虚拟功能,使虚拟   功能受保护。

     

对于析构函数的特殊情况   只有:

     

准则#4:基类析构函数   应该是公共的和虚拟的,   或受保护和非虚拟。