代码如下
// A has a virtual function F().
class A
{
public:
virtual void F() {};
};
// The same for B.
class B
{
public:
virtual void F() {};
};
// C inherits A and B.
class C : public A, public B
{
public:
// How to implement the 2 virtual functions with the same name but from
// different base classes.
virtual F() {...}
};
请注意,基类中有一个F()的默认实现。
感谢Jan Herrmann和Spook。如果我们必须使用一些额外的帮助,下面是一个更简单的解决方案吗?
#include <iostream>
// A has a virtual function F().
class A
{
private:
virtual void A_F() {}
public:
void F() {return A_F();};
};
// The same for B.
class B
{
private:
virtual void B_F() {}
public:
void F() {return B_F();};
};
// C inherits A and B.
class C : public A, public B
{
private:
virtual void A_F() {std::cout << "for A\n";}
virtual void B_F() {std::cout << "for B\n";}
};
int main()
{
C c;
c.A::F();
c.B::F();
return 0;
}
答案 0 :(得分:4)
class C_a
: public A
{
virtual void F_A() = 0;
virtual void F() { this->F_A() };
};
class C_b
: public B
{
virtual void F_B() = 0;
virtual void F() { this->F_B() };
};
class C
: public C_a
, public C_b
{
void F_A() { ... }
void F_B() { ... }
};
如果我记得正确,ISO委员会会考虑这个问题并讨论语言的变化。但后来......有人找到了解决这个问题的好方法: - )
如果您能够更改类层次结构,那么您的第二个解决方案会更好。您可以锁定http://www.gotw.ca/publications/mill18.htm以获取更好的说明。
答案 1 :(得分:2)
试试这个:
#include <cstdio>
class A
{
public:
virtual void F() = 0;
};
class B
{
public:
virtual void F() = 0;
};
class C : public A, public B
{
void A::F()
{
printf("A::F called!\n");
}
void B::F()
{
printf("B::F called!\n");
}
};
int main(int argc, char * argv[])
{
C c;
((A*)(&c))->F();
((B*)(&c))->F();
getchar();
return 0;
}
但请注意,您将无法从C的实例中调用F(模糊调用)。
另外,F 在A和B中是抽象的,否则你会得到编译错误:
Error 1 error C3240: 'F' : must be a non-overloaded abstract member function of 'A'