C++多继承函数名称冲突
C++ multiple inheritance function name collision
上下文:我在工作中讨论C#与Java时,出现了以下问题,我想知道如何(或是否)在C++中优雅地解决这个问题
假设您有两个类A
和B
(它们的详细信息并不重要),然后有两个模板化类G
和H
,它们被描述为:
template <typename T> | template <typename T>
class G | class H
{ | {
public : | public :
T * foo() ; | virtual T * foo() = 0 ;
// etc. | // etc.
} ; | } ;
然后我们将类C
和D
描述为:
class A { /* ... */ } ;
class B { /* ... */ } ;
class C : public G<A>, public G<B>
{
} ;
class D : public H<A>, public H<B>
{
// ???
} ;
我希望能够为C
调用G<A>
中的方法foo
和G<B>
中的foo。并且我希望能够为D
重写H<A>
和H<B>
中的方法foo
。
最后,我希望能够像下面的例子一样使用C和D:
C c ;
A * a = c.??? ; (I want to call G<A>::foo())
B * b = c.??? ; (I want to call G<B>::foo())
D d ;
A * a = c.??? ; (I want to call H<A>::foo())
B * b = c.??? ; (I want to call H<B>::foo())
总有一些方法可以做到这一点(我有一些想法),但我感兴趣的是一系列优雅安全的方法,包括利弊。
那么,你会怎么做呢
我能想到的两种方法:
C x;
x.G<A>::foo(); // 1
static_cast<G<A>&>(x).foo(); // 2
也就是说:要么显式限定函数的名称,要么在类型层次结构中向上转换。
如何,重载和使用不同的参数:
template <typename T>
class G
{
public:
T * foo(T &a) {/* ... */};
// etc.
};
class A
{
public:
/* ... */
};
class B
{
public:
/* ... */
};
class C : public G<A>, public G<B>
{
public:
using G<A>::foo;
using G<B>::foo;
};
int main()
{
C c;
A a;
B b;
c.foo(a);
c.foo(b);
return 0;
}
相关文章:
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 我在C++中使用提升哈希函数将 3 个双精度组合成一个面临冲突的哈希
- 为什么构造函数 Message(const T&data) 与 Message(T&& data) 冲突,当 T = int&时?
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- 如何处理冲突的函数和变量名称?
- 无冲突的哈希函数
- 使用 EvtSetChannelConfigProperty() 函数时出现访问冲突错误
- (此函数用于计算 SMA).在 FA.exe 中0x00509159引发异常: 0xC0000005:访问冲突读取位置0
- 函数 AfxEndThread 中的读取访问冲突"pThread-> was nullptr"
- 读取类的析构函数中的位置时发生访问冲突
- 使用 Murmur2 64 位哈希函数生成会导致冲突的输入
- 在 C 代码中调用 Python 函数时第三次出现访问冲突写入位置错误
- 使用向量的函数崩溃,调试器说访问冲突读取位置
- 读取IMAGE_EXPORT_DIRECTORY以查找导出的函数名称会导致访问冲突
- 可变参数模板类 - 0 长度包构造函数冲突
- C++ python 中的函数来自使用 ctypes 的.dll - 找不到函数和访问冲突
- 进入函数之前的访问冲突异常
- C++编译错误是由于使用 std::move 时运动构造函数与其他非运动构造函数之间的冲突
- 删除函数 c++ 的读取访问冲突异常
- C 矢量构造函数实例冲突