【问题标题】:Different derived classes share the same method不同的派生类共享相同的方法
【发布时间】:2014-12-01 07:03:00
【问题描述】:

更新:我刚刚知道 c++ 支持多重继承。我认为多重继承是解决这个问题的最好方法..

我有一个关于多个派生类共享方法的问题。代码如下:

class Base{
public:
    virtual double method1();
    virtual double method2();
}

class A::public Base{
public:
    virtual double method1();
    virtual double method2();
}

class B::public Base{
public:
    virtual double method1();
    virtual double method2();
}

class C::public Base{
public:
    virtual double method1();
    virtual double method2();
}

class D::public Base{
public:
    virtual double method1();
    virtual double method2();
}

对于A类和B类,method1()是一样的;对于 C 类和 B 类,method1() 是相同的。 (它使用基类成员作为参数)。

与其为A类和B类写相同的method1(),我认为这可以简化为:

class subBase1::public Base{
public:
    void double method1();
}
class A::public subBase1{}
class B::public subBase1{}


class subBase2::public Base{
public:
    void double method1();
}
class A::public subBase2{}
class B::public subBase2{}

但是现在对于 B 类和 C 类,method2() 也是一样的(它使用基类成员作为参数)。我能做些什么?有没有办法让 A&B 共享一种方法,而 B&C 共享另一种方法?

谢谢!

【问题讨论】:

  • 还要检查virtual inheritance
  • 谢谢。我刚知道c++支持多重继承。我认为多重继承是解决这个问题的最好方法..

标签: c++ inheritance derived-class virtual-functions


【解决方案1】:

以下代码将完成此操作。

class Base
{
    public:
        virtual double method1() { /* code shared by A and B */ }
        virtual double method2() { /* code shared by B and C */ }
};

class A : public Base
{
    public:
        virtual double method2() { /* code specific to A */ }
};

class B : public Base
{
};

class C : public Base
{
    public:
        virtual double method1() { /* code specific to C */ }
};

然而,值得注意的是,一旦进行了这些修改,B 就等同于Base。可能值得重新评估您的继承层次结构,以确定AC 是否应该从B 继承,如下所示:

class B
{
    public:
        virtual double method1() { /* code shared by A and B */ }
        virtual double method2() { /* code shared by B and C */ }
};

class A : public B
{
    public:
        virtual double method2() { /* code specific to A */ }
};

class C : public B
{
    public:
        virtual double method1() { /* code specific to C */ }
};

【讨论】:

  • 谢谢!如果我有 D 类和 C 类共享相同的 method1(),我需要为 C 和 D 分别指定 method1 吗?
  • 您可以将D 设为C 的子类。 D::method1() 将继承自 CC::method2()D::method2() 将继承自 B(或 Base,在第一个示例中)。在那种复杂程度下,我会开始重新评估我的继承层次结构,但这是个人主观偏好。不过,也许您的问题可以通过组合而不是继承更好地解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2012-03-14
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2011-02-27
  • 2014-11-27
相关资源
最近更新 更多