gpt4 book ai didi

c++ - 继承共享方法名的接口(interface)

转载 作者:IT老高 更新时间:2023-10-28 13:23:41 25 4
gpt4 key购买 nike

有两个基类具有相同的函数名。我想继承它们,并以不同的方式覆盖每种方法。如何使用单独的声明和定义(而不是在类定义中定义)来做到这一点?

#include <cstdio>

class Interface1{
public:
virtual void Name() = 0;
};

class Interface2
{
public:
virtual void Name() = 0;
};

class RealClass: public Interface1, public Interface2
{
public:
virtual void Interface1::Name()
{
printf("Interface1 OK?\n");
}
virtual void Interface2::Name()
{
printf("Interface2 OK?\n");
}
};

int main()
{
Interface1 *p = new RealClass();
p->Name();
Interface2 *q = reinterpret_cast<RealClass*>(p);
q->Name();
}

我未能在 VC8 中将定义移出。我发现 Microsoft 特定关键字 __interface 可以成功完成这项工作,代码如下:

#include <cstdio>

__interface Interface1{
virtual void Name() = 0;
};

__interface Interface2
{
virtual void Name() = 0;
};

class RealClass: public Interface1,
public Interface2
{
public:
virtual void Interface1::Name();
virtual void Interface2::Name();
};

void RealClass::Interface1::Name()
{
printf("Interface1 OK?\n");
}

void RealClass::Interface2::Name()
{
printf("Interface2 OK?\n");
}

int main()
{
Interface1 *p = new RealClass();
p->Name();
Interface2 *q = reinterpret_cast<RealClass*>(p);
q->Name();
}

但是是否有另一种方法可以在其他编译器中使用更通用的方法?

最佳答案

这个问题并不经常出现。我熟悉的解决方案是由 Doug McIlroy 设计的,并出现在 Bjarne Stroustrup 的书籍中(在C++ 的设计与演变第 12.8 节和 C++ 编程语言第 25.6 节中都有介绍)。根据 Design & Evolution 中的讨论,有人提议优雅地处理这个特定案例,但被拒绝了,因为“这种名称冲突不太可能变得普遍到足以保证单独的语言特性”并且“不太可能成为新手的日常工作。”

您不仅需要通过指向基类的指针调用 Name(),还需要一种方式来表示 which Name()在派生类上操作时需要。该解决方案增加了一些间接性:

class Interface1{
public:
virtual void Name() = 0;
};

class Interface2{
public:
virtual void Name() = 0;
};

class Interface1_helper : public Interface1{
public:
virtual void I1_Name() = 0;
void Name() override
{
I1_Name();
}
};

class Interface2_helper : public Interface2{
public:
virtual void I2_Name() = 0;
void Name() override
{
I2_Name();
}
};

class RealClass: public Interface1_helper, public Interface2_helper{
public:
void I1_Name() override
{
printf("Interface1 OK?\n");
}
void I2_Name() override
{
printf("Interface2 OK?\n");
}
};

int main()
{
RealClass rc;
Interface1* i1 = &rc;
Interface2* i2 = &rc;
i1->Name();
i2->Name();
rc.I1_Name();
rc.I2_Name();
}

不漂亮,但决定是不需要经常这样做。

关于c++ - 继承共享方法名的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2004820/

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