C++:选择性地限制对超类的访问?

C++:选择性地限制对超类的访问?,c++,inheritance,C++,Inheritance,这是一个面试问题。我不是C++专家,所以我需要一些帮助来找到这个问题的答案。我首先想了解这个问题……这是一个有效的问题吗?< 问题: 假设我有一个派生的类B 来自A类,我想重复使用 A的一些方法,但不是全部。 我将如何限制访问 选择超类的方法 谢谢 我想 您不能更改的定义 您要选择从A中的哪些方法应该可以从B对象访问。 using指令解决了您的问题。例如: class A { public: // or protected for that matter void foo();

这是一个面试问题。我不是C++专家,所以我需要一些帮助来找到这个问题的答案。我首先想了解这个问题……这是一个有效的问题吗?< 问题:

假设我有一个派生的类B 来自A类,我想重复使用 A的一些方法,但不是全部。 我将如何限制访问 选择超类的方法

谢谢

我想

您不能更改的定义 您要选择从A中的哪些方法应该可以从B对象访问。 using指令解决了您的问题。例如:

class A
{
public: // or protected for that matter
    void foo();
    void bar();
};

class B : private A // or protected, depending on whether
                    // you want subclasses of B to expose
                    // some methods from A themselves
{
public:
    using A::foo;
};

使foo在B类中可用,但在bar中不可用。但作为警告,请注意使用::foo将公开foo的所有重载。

他们可能希望听到的答案是,您可以将要重用的方法放在基类的受保护部分,派生类不可见的方法应该放在私有部分


但是,退一步说,您可能会指出重用代码可能有更好的措施,这取决于函数的作用,例如使用头文件中不可见的自由函数。您可能是想重用一些。。。是的。。我已经做了更正。谢谢。这是一个很好的解决方案,满足了给出的问题。但是,应该注意的是,类B与继承层次结构完全分离,因此不可能执行类似于B objB的操作;A*ptrA=&objB;。好吧,这个问题没有完全令人满意的解决方案。@Baltasarq:如果你可以通过一个指向A的简单指针来访问A的方法,那么限制A的方法有什么意义?回想一下,私有继承不是一种关系,而是一种关系。它只与普通的公共继承有远程关系,应该被视为一种组合设备。您可以解释一下,但作为一个警告,请注意使用a::foo将公开foo的所有重载吗?@maxpayne:如果您有多个具有不同签名的foo方法,您要么将它们作为一个组公开,要么根本不公开。@Tony,@Alexandre,考虑到所有的注意事项,我更愿意将类包装在适配器中。我知道,正如所问的那样,这个问题不允许这种解决办法,但我认为这是首选办法@托尼,埃菲尔确实允许在继承上重命名方法。此外,mixin是公认的继承用法,与Liskov替换不匹配。@maxpayne:普通函数,即不是成员函数方法的函数,而您的解决方案非常简单和干净……我认为如果不允许更改类A中的代码,它将不起作用。。