gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:54 25 4
gpt4 key购买 nike

我有多个父类的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com