2017-08-28 26 views
0

我有关于继承的问题。我的情况是这样的:使用派生类C++的方法的超类

我有两个类(AThisWay,AThatWay),我希望能够随时更换。他们都有相同的方法名称,但在方法内部做了不同的事情。他们的属性和方法被其他类使用(B)。 在开始时我只有AThisWay,它是B的超类,但现在我也有AThatWay,我想知道是否有可能使AThisWay和AThatWay成为子类ob B,这样我就不会对属性产生困惑,或者如果有一种方法可以随时改变B的超类。这方面的最佳做法是什么?

最佳 圣

编辑: 现在我做这种方式(注②仅从AThisWay派生),但我想B到也能够有时使用AThatWay的方法。就像AThisway和AThatWay是我的不同物理模型一样,我希望能够这样做我的微积分,有时候这样做只是为了测试我的模型。我现在看到的最快的方法是复制B并从AThatWay中派生出来,但这当然不是很好,也不容易调试。

class AThisWay { 
public: 
    int aNumber 
    void aMethod() { aNumber = 1; } 
} 

class AThatWay { 
public: 
    int aNumber 
    void aMethod() { aNumber = 2; } 
} 

class B: public AThisWay{ 
public: 
    int anOtherNumber 
    void otherMethod() 
     { 
     aMethod(); 
     anOtherNumber = aNumber + 2; 
     } 
} 
+5

阅读起来多态性,虚拟和重写函数以及派生类的基类指针。 – Ron

+0

“基类指向派生类”是唯一的选择,还是有办法告诉B在构造它时使用了什么超类?^从B派生A更聪明吗?就像那样,如果没有它的子类,那么B类就不能做任何事情。 –

+1

听起来像你需要* interface A *,被* class B *使用,并由那些* AXxxXxx *类实现。 (是的,即使没有明确的关键字,C++也支持接口的概念)。 – hyde

回答

1

我可能无法正确得到它,你通过“交换不时”的意思,但在我看来,你应该建立一个共同的基类的AThisWayAThatWay,并让班B通过使用他们的共同基础。这样你就不必从任何这些类中派生出来。

class AWay { 
public: 
    virtual void method() = 0; 
} 

class AThisWay : public AWay { 
public: 
    virtual void method() override { /* code A */ } 
} 
class AThatWay : public AWay { 
public: 
    virtual void method() override { /* code B */ } 
} 

B类:

class B { 
public: 
    B(bool isThat) { 
     if (isThat) aWay = new AThatWay(); 
     else aWay = new AThisWay(); 
    } 

    void bar() { aWay->method(); } 
private: 
    AWay *aWay = nullptr; 
} 

(上面的例子中忽略了像一些细节:动态内存的释放,这将是更好地使用智能指针等)

+0

这可以工作,但我想保留派生类相互派生,因为派生类是我的模型的扩展。那有意义吗? –

+0

如果你想保持这种结构,你可以。构成只是另一种做同样事情的方式。不知道整个情况很难确定什么是最好的。以下是关于该主题及其缺陷的[文章](http://www.cprogramming.com/tutorial/multiple_inheritance.html)。 – nothingam