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

Sai*_*aif 5 c++ inheritance visual-c++ c++11

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

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

现在我希望class B包含Aexcept的所有函数f3.

我在做的是:

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

    }
};
Run Code Online (Sandbox Code Playgroud)

据我所知,B::f3()是隐藏的定义A::f3(),并且B::f3()是私有的,f3()无法通过类访问B.但我仍然可以这样称呼:

B var();
var.A::f3();
Run Code Online (Sandbox Code Playgroud)

有什么办法,我可以完全隐藏f3从类B使用继承和不改变类A

Bri*_*ian 9

你应该不会让B继承A.

如果B缺少某些功能A,那么B并且A没有继承意图建模的is-a关系(以及哪些客户端会期望).你应该使用组合:引入一个B类型的成员A.

  • 或者将A类分成多个类.B可以完全从中得到的一个类.取决于你的情况.至少它表明你的班级设计需要更多的工作. (4认同)
  • @SaifUllah称重:后来找到这样的代码库并且意识到它的原始作者在各地都不恰当地使用继承,只是为了节省一些打字,就像现在不得不取消所有不必要的耦合和vtable开销(大小和时间) )说作者的懒惰介绍.顺便说一下,"原作者"和"某人"可能是同一个人; 不要低估你惹恼未来自我的能力.我从经验中说,作为一个学习了垃圾邮件继承在以后尝试重构时产生实际开销和问题的困难方法的人 (3认同)

Gal*_*lik 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
};
Run Code Online (Sandbox Code Playgroud)

这可能有意义的时候是因为所涉及的方法数量太多,因此组成过于繁琐.