我有一个类('TestC'),它派生自另外两个类('TestA' 和'TestB'),它们都有一个具有相同签名的虚函数。
为了使该功能可以通过“TestC”访问,我必须告诉它要使用哪个版本。如果我明确覆盖“TestC”中的函数并调用我想要的版本,则此方法有效:
#include <iostream>
class TestA
{
public:
virtual void test() {std::cout<<"a";}
};
class TestB
{
public:
virtual void test() {std::cout<<"b";}
};
class TestC
: public TestA,public TestB
{
public:
void test() {TestB::test();}
};
int main(int argc,char *argv[])
{
TestC c;
TestA *a = static_cast<TestA*>(&c);
a->test();
c.test();
for(;;);
return EXIT_SUCCESS;
}
输出:“bb”
这就是预期的结果。但是,我注意到如果我使用 'using' 关键字,而不是显式地覆盖函数,我会得到一些意想不到的行为:
class TestC
: public TestA,public TestB
{
public:
using TestB::test;
};
(其他都一样)
输出:“ab”
谁可以给我解释一下这个?看起来“测试”突然不再是虚拟的了?有没有办法做到这一点,而无需显式覆盖函数?(类似于“使用覆盖”)