说我有一个抽象类
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将会更加困难,并导致我头痛。
提前感谢您的帮助。如果这是一个愚蠢的问题,请提前抱歉!
答案 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:基类析构函数 应该是公共的和虚拟的, 或受保护和非虚拟。