我有一个类 ('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”
有人能给我解释一下吗?看起来“测试”突然不再是虚拟的了?有没有办法做到这一点,而无需明确覆盖该功能? (类似于“使用覆盖”)
最佳答案
使用using
,您不需要定义TestC::test()
,而是告诉TestB::test()
是可见的(因此隐藏了 TestA::test()
,这使得 c.test()
没有歧义)。
关于c++ - 'using' 关键字从多个虚拟继承函数中进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37611120/