Joh*_*ohn 5 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;
Run Code Online (Sandbox Code Playgroud)
如果就是这样,我就没有问题 - 我可以使用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();
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,不是因为它引入了新的歧义(虽然它可能),但是因为
"错误C3240:'myFunc':必须是'BaseA'的非重载抽象成员函数"
"错误C2838:成员声明中的非法限定名称"
在不同的情况下,我可能只是重命名方法,或者像编译器建议的那样使它们成为纯虚方法.但是,类层次结构和许多外部问题使得第一个选项非常困难,第二个选项不可能.
有没有人有建议?为什么限定符仅允许纯虚方法?有没有办法同时覆盖虚拟方法和解决歧义?
Microsoft 允许该语法(从 Visual C++ 2005 开始可用)。 他们还引入了一种新的、更强大的语法,仅适用于托管代码。
两者均未包含在 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() {}
};
Run Code Online (Sandbox Code Playgroud)