2010-08-26 64 views
2

说我有一个抽象类只有在引用基类时才能调用的方法? C++

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++,所以上面的代码可能不太对,但你也许会明白。我有一组类需要能够做出“危险的事情”(以他们自己的特殊方式),如果这些类的不止一个对象做这个危险的事情,可能会引发问题。我想有一个只有一个对象的必需的指针的管理器类。如果方法doSomethingDangerous只能由必需的对象来调用,那么意外的调用会更难以发生,并且会让我头痛不已。

在此先感谢您的帮助。对不起,如果这是一个愚蠢的问题!

回答

4

当然。只需在派生类中创建private,并在基础中创建public

当然,如果NecessaryDanger是公共基地,那么任何人都可以施放和打电话。您可能想将其设为私人基地并使用friend

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

private: 
    void doSomethingDangerous(); 

    friend class DangerManager; 
} 
+0

你能解释一下如何去和朋友一起做这件事吗?我是否会像派生类一样从基类派生:私有基础,将危险方法设为私有,并将基类声明为朋友? 为什么使基地私人防止铸造? 谢谢 – Johnny 2010-08-26 06:07:54

+0

更新了代码示例。这几乎和你所描述的一样,但是让经理级别成为朋友:你希望它能够完全访问“私人”的东西。使基地保密是防止施放到基地的,因为当某些东西是私人的时候,班级本身和其朋友之外没有任何东西可以告诉它存在。 – Potatoswatter 2010-08-26 06:15:01

+0

感谢您的编辑!但是,这不会允许我在DangerManager的任何地方为任何对象调用此方法吗?那么如果我需要在DangerManager之外的某个地方稍后在其他环境中调用doSomethingDangerous呢? 我仍然会像从DoesOtherStuff d危险管理器中调用此= DoesOtherStuff(); d.doSomethingDangerous;对?有没有一种方法我只能称之为必要的危险* n; N-> doSomethingDangerous()?感谢您的支持。 – Johnny 2010-08-26 06:19:24

2

在超类中删除virtual分类器,使得编译器编译时结合基于变量类型,而不是运行时间绑定基于对象类型。

+0

如何消除虚拟解决问题?这将更有可能打破一切。 – Potatoswatter 2010-08-26 06:16:20

+0

调用'doSomethingDangerous()'上'NecessaryDanger'变量调用'NecessaryDanger :: doSomethingDangerous',不管是什么类型的包含的变量是对象。删除'虚拟'打破该方法的多态性,这是提问者想要的。 – 2010-08-26 06:24:47

+0

他是如何表明他不想要多态性的? – Potatoswatter 2010-08-26 06:31:20

0

大厦Potatswatter的回应:)

Here是香草的建议是:(尤其是1和2)适用于这种情况下。

准则#1:不想做 接口非虚,使用模板 方法。
准则#2:优先使 虚拟功能保密。
准则#3:只有派生类需要调用虚拟函数的基本实现时,才能使虚拟函数受保护。

析构函数 唯一的特例:

方针#4:基类的析构函数 应该是公开和虚拟, 或保护和非虚。

相关问题