避免指定在钻石设计中调用的函数

时间:2013-11-15 22:42:59

标签: c++ diamond-problem

我目前有钻石设计,我看到了一个相关的问题here

在这个问题中,让我假设B类和C类是从A类继承的虚拟,所以在D类中,当我们需要调用虚函数时,我们需要指定需要调用的函数。

D::foo()
{
  B::foo(); //specify foo() in B
}

对于我的钻石设计,我有很多虚函数要重写,以便通过正确的B或C父类函数调用这些函数。

这不好,需要做很多重复工作,当我有子课时,你有一些更好的解决方案,这样我就可以在D类中调用B的foo()但是没有重写这个例子上方。

2 个答案:

答案 0 :(得分:1)

从C ++ 11开始,你可以进行别名:

class A
{
    public:
        virtual void foo() { cout << "A" << endl; }
}


class B : public virtual A
{
    public:
        void foo() { cout << "B" << endl; }
}


class C : public virtual A
{
    public:
        void foo() { cout << "C" << endl; }
}

class D : public B, C
{
    using B::foo;
}

这样,做:

D obj;
obj.foo();

将输出B;

答案 1 :(得分:-3)

我认为模板类可能会在这里发挥作用。

http://www.cplusplus.com/doc/tutorial/templates/