【问题标题】:Create a class that contains all functions of its parent class except one创建一个包含其父类的所有功能的类,除了一个
【发布时间】:2017-02-23 01:39:51
【问题描述】:

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

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

现在我希望B 类包含A 的所有功能,除了f3

我正在做的是:

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

    }
};

据我所知,B::f3() 隐藏了A::f3() 的定义,并且由于B::f3() 是私有的,f3() 不能通过类B 访问。但我仍然可以这样称呼它:

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

有什么方法可以使用继承而不更改类 Af3 从类 B 中完全隐藏?

【问题讨论】:

  • 继承对扩展有用,而不是限制。你可能想在你的情况下使用组合。
  • 如果子类没有其父类的所有功能,那么它可能不应该从它派生。

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


【解决方案1】:

不要养成通过继承将类拼凑在一起的习惯,方法是混合和匹配大致执行您想要的类的类。这会导致糟糕的代码。

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

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

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
};

这可能是有意义的时候,因为涉及的方法太多,组合太乏味了。

【讨论】:

  • 私有继承可以被认为是“实现于”的意思。即“B 类是根据 A 类实现的”。这正是私有继承要解决的问题。
【解决方案2】:

您不应该B 继承自A

如果B 缺少A 的某些功能,则BA 不具有继承旨在建模的is-a 关系(以及客户所期望的) )。您应该改用组合:引入B 类型为A 的成员。

【讨论】:

  • 或者把A类分成多个类。 B 可以完全派生的一类。取决于你的情况。至少它表明你的班级设计需要更多的工作。
  • 如果我在 B 类中编写 A,那么我可能必须为 A 的每个必需函数编写包装函数,这在现实生活中的例子中可能会很烦人。
  • @SaifUllah 那么也许你应该调查一下 Respect2All 的建议是否适合你。
  • @SaifUllah 权衡一下:后来发现这样的代码库并意识到它的原作者到处不恰当地使用继承,只是为了节省一些打字,因为现在必须取消所有不必要的说作者的懒惰引入的耦合和vtable开销(大小和时间)。顺便说一句,“原作者”和“某人”可能是同一个人;不要低估你惹恼未来自己的能力。我从经验中说,作为一个经历过垃圾邮件继承会在以后尝试重构时产生真正的开销和问题的人
【解决方案3】:

你可以用私有继承作弊

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

【讨论】:

    猜你喜欢
    • 2019-01-24
    • 1970-01-01
    • 2017-05-08
    • 2020-10-16
    • 2018-09-12
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多