c++ - 覆盖限定的虚拟方法

标签 c++ virtual-functions ambiguity

我有多个父类的 C++ 类;每个父级都定义了一个具有通用名称但用途不同的函数:

class BaseA
{
    virtual void myFunc();  // does some task
};
class BaseB
{
    virtual void myFunc();  // does some other task
};
class Derived : public BaseA, public BaseB;

如果是这样,我就没问题了 - 我可以用 using 语句解决歧义,我可以使用基类名称和范围解析运算符选择调用哪个.

不幸的是,派生类需要覆盖它们:

class Derived : public BaseA, public BaseB
{
    virtual void BaseA::myFunc(); // Derived needs to change the way both tasks are done
    virtual void BaseB::myFunc();
}

这行不通,不是因为它引入了新的歧义(尽管可能),而是因为

"error C3240: 'myFunc' : must be a non-overloaded abstract member function of 'BaseA'"

"error C2838: illegal qualified name in member declaration"

在不同的情况下,我可能只是重命名这些方法,或者按照编译器的建议将它们设为纯虚拟方法。然而,类层次结构和许多外部问题使得第一个选项极其困难,而第二个选项则不可能。

有人有什么建议吗?为什么限定符只允许用于纯虚拟方法?有什么方法可以同时覆盖虚方法和解决歧义吗?

最佳答案

Microsoft allows that syntax (从 Visual C++ 2005 开始可用)。 They also introduced a new, more powerful syntax for managed code only .

两者都没有包含在 C++0x 中。

参见 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2108.html


我认为这是一个解决方法:

class BaseA
{
protected:
    virtual void myFunc();  // does some task
};
class BaseB
{
protected:
    virtual void myFunc();  // does some other task
};
class ShimA : virtual BaseA
{
    virtual void myFunc() { myFuncA(); }
protected:
    virtual void myFuncA() { BaseA::myFunc(); }
};
class ShimB : virtual BaseB
{
    virtual void myFunc() { myFuncB(); }
protected:
    virtual void myFuncB() { BaseB::myFunc(); }
};
class Derived : public virtual BaseA, public virtual BaseB, protected ShimA, protected ShimB
{
     virtual void myFuncA() {}
     virtual void myFuncB() {}
};

关于c++ - 覆盖限定的虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5481356/

相关文章:

窗口内的C++输入框

c++ - 可以在同一个类中重写纯虚函数吗?

c++ - 为什么在构造字符串时 `std::istreambuf_iterator<char>`被视为函数声明?

c++ - 有效的语言环境名称

c++ - IHTMLDocument2::get_body 在 IE 11 的 CHtmlView 中失败

Eclipse:找到虚函数实现的更好方法是什么?

c++ - 虚拟模板方法有意义吗?

c++ - 尝试按值对 map 进行排序但出现错误

c++ - 转发声明使用 enable_if : ambiguous call 的函数

c++ - 初始化 const 类成员,错误 : declaration does not declare anything