以下类结构:
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 )。谢谢!
答案 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_f
和interface_base_g
都指向相同的interface_base
。这也适用于他们的衍生物。 f()
的{{1}}和implementation_f1
的{{1}}。g()
子对象。