多态继承和接口的合并

时间:2015-03-23 22:52:10

标签: c++ inheritance polymorphism virtual

以下类结构:

class interface_base
{
    public:
        virtual void f() {};
        virtual void g() {};
};

class interface_base_f : public interface_base
{
    public:
        virtual void f() {};
};

class interface_base_g : public interface_base
{
    public:
        virtual void g() {};
};

class implementation_f1 : public interface_base_f
{
    public:
        virtual void f() { cout << "f1" << endl; };
};

class implementation_f2 : public interface_base_f
{
    public:
        virtual void f() { cout << "f2" << endl; };
};

class implementation_g1 : public interface_base_g
{
    public:
        virtual void g() { cout << "g1" << endl; };
};

class implementation_g2 : public interface_base_g
{
    public:
        virtual void g() { cout << "g2" << endl; };
};

所以 interface_base_f 将决定使用哪种 f 函数( f1 f2 )和 interface_base_g 将关注 g

// Dynamic polymorphism
interface_base_f * ibf = new implementation_f1(); // Not f2!
interface_base_g * ibg = new implementation_g2(); // Not g1!

现在我想做这样的事情

interface_base * ib;
ib = ibf; // now "f" part of "ib" is "ibf" (which is "f1")
ib = ibg; // now "g" part of "ib" is "ibg" (which is "g2") (I hope ...)
ib -> f(); // will get "f1"?
ib -> g(); // will get "g2"?
ib -> f(); // will get "f1"?

当然

ib = ibf; 
ib = ibg; // overwrites previous instruction!

输出

g2

使 ib-&gt; f() ib-&gt; g() 两者成为可能的关键是什么? ? 别忘了 f g 是多态对象( f 可以 f1 f2 g 可以是 g1 g2 )。谢谢!

1 个答案:

答案 0 :(得分:4)

您可以将多重继承与virtual inheritance结合使用:

// these need to be redefined virtual
class interface_base_f : public virtual interface_base
{
public:
    virtual void f() {};
};
class interface_base_g : public virtual interface_base
{
public:
    virtual void g() {};
};

然后您可以定义类:

struct implementation_f1g2 : public implementation_f1, public implementation_g2 { };

然后应用此构造:

implementation_f1g2 *pmy12 = new implementation_f1g2();
pmy12->f(); 
pmy12->g();
interface_base *pb = pmy12;
pb->f();
pb->g();

原则很简单:

  • virtual不干扰意味着interface_base_finterface_base_g都指向相同的interface_base。这也适用于他们的衍生物。
  • 多重继承意味着implementation_f1g2继承自f()的{​​{1}}和implementation_f1的{​​{1}}。
  • 您是否只使用多重继承,您的f1g2对象将继承两个不同的interface_base子对象,每个子对象都有自己的f()和g()以及覆盖。因此,调用任何这些函数或转换为基类是不明确的。
  • 但是将它与虚拟基础相结合意味着尽管有多重继承,但只有一个g()子对象。

Multiple virtual inheritance