创建一个包含其父类除了一个函数的所有函数的类

时间:2016-10-13 19:25:32

标签: c++ c++11 inheritance visual-c++

假设我有两个班, 一个是:

class A{
public:
    void f1()
    {
        cout << "function 1";
    }
    void f2()
    {
        cout << "function 2";
    }
    void f3()
    {
        cout << "function 3";
    }
};

现在我希望课程B包含Af3以外的所有功能。

我正在做的是:

class B: public A
{
    private:
    void f3()
    {

    }
};

据我所知,B::f3()隐藏了A::f3()的定义,而B::f3()是私有的,f3()无法通过班级B访问。但我仍然可以这样称呼:

B var();
var.A::f3();

有什么方法可以使用继承而不更改类f3B类隐藏A

3 个答案:

答案 0 :(得分:9)

您应该不要B继承A

如果B缺少A的某些功能,那么BA就没有 is-a 关系,继承意图建模(以及客户期望的)。您应该使用组合:引入类型为B的{​​{1}}成员。

答案 1 :(得分:9)

不要养成通过混合和匹配类似于你想要的类来继承拼接类的习惯。这会导致糟糕的代码。

然而,偶尔通过另一个类实现一个类是有意义的。在这些情况下,如果您使用的是继承,那么“正确”的方法是使用私有继承。

“正确”是指最可接受的方式。

class A
{
public:
    void f1()
    {
        cout << "function 1";
    }
    void f2()
    {
        cout << "function 2";
    }
    void f3()
    {
        cout << "function 3";
    }
};

class B: private A
{
public:
    using A::A; // use A's constructors
    using A::f1;
    using A::f2;
    // do not use f3
};

这可能有意义的时候是因为所涉及的方法数量太多而且构图太繁琐了。

答案 2 :(得分:4)

你可能会欺骗私人继承

class B : private A
{
public:
    using A::f1;
    using A::f2;
};