在C ++中禁用或隐藏某些父类函数

时间:2016-01-06 17:48:07

标签: c++

我注意到可能有不同的方法来禁用或隐藏从父类继承的某些类成员函数。

例如,给定以下基类:

class Foo {
public: 
    void funcA() {}
};

选项1

class Bar : public Foo {
private:
     Foo::funcA;
};

(编辑:我稍后会注意到选项1 会在clang下出错:" ISO C ++ 11不允许访问声明;请改用使用声明&# 34)

选项2

class Bar : public Foo {
private:
     using Foo::funcA; 
};

选项3

class Bar : public Foo {
public:
    void funcA() = delete; 
};

哪种方法更好?或者它们是否一样?

在您尝试这样做之前,请阅读以下@JeffCoffin等的评论。人:

  

您想要禁用或隐藏父类中的某些内容的事实往往表明您可能不应该将其用作父类来开始

2 个答案:

答案 0 :(得分:2)

这三个选项并不相同。对于前两个我不确定是否有任何真正的区别(我无法测试它们,因为我没有电脑,但我认为它们是相同的)。但第三个肯定是不同的 - 它擦除方法。因此,在第三种情况下,您将无法从该类的其他方法调用该方法,而在前两种情况下,您将能够这样做。

答案 1 :(得分:0)

在某些情况下,你只需要从基类中隐藏一些方法,而你无法删除它们,想象你有这样的东西:

/**
 * Draws elements
 */
class Type1 {/*class contents*/}
/**
 * Handle Input
 */
class Type2 : public Type1 {/*class contents*/}
/**
 * Handle Very special input
 */
class Type3 : public Type2 {/*class contents*/}

class BasePools {

public:

        BasePools(/*some initialization here*/);

        /* some generic functionality methods here, and pure virtual ones */
        void blah();
        virtual blah2() = 0;
        virtual ~BasePools();

        // just as example some setters
        void add(Type1* newElement) {/* adds element to pool: Type1*/}
        void add(Type2* newElement) {/* adds element to pools: Type2 and Type1*/}
        void add(Type3* newElement) {/* adds element to pools: Type3, Type2 and Type1 here*/}

protected:

        void handleType1() {/* do something with Type1 pool elements */}
        void handleType2() {/* do something with Type2 pool elements */}
        void handleType3() {/* do something with Type3 pool elements */}

// control pools.
        vector<Type1*> poolType1;
        vector<Type2*> poolType2;
        vector<Type3*> poolType3;
}

class SpecialType2 : public Type2 {/*extends Type2 */}

/**
 * Class that uses SpecialType2 only but needs access to the pools and methods.
 */
class SomeSpecialContainer : public BasePools {

public: 

        using BasePools::BasePools;

        // only allow this type.
        void add(SpecialType2* newElement) {/* adds element to pools: Type2 and Type1*/}

protected:

        // hide defaul adders.
        using BasePools::add;
}

如您所见,SomeSpecialContainer只会处理SpecialType2并隐藏其他基本类型。