c++ - 'using' 关键字从多个虚拟继承函数中进行选择

标签 c++ c++11 virtual-functions overriding using-declaration

我有一个类 ('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/

相关文章:

c++ - 混合 decltype 和 enable_if

c++ - 何时在 C++ 中使用 __declspec(dllexport)

c++ - 虚函数声明和定义的困惑

c++ - 将成员函数指针与 0 进行比较是否总是有效的 C++?

c++ - 在类似地震的控制台中自动取消注册命令的正确方法是什么?

c++ - 避免显式仿函数模板类型

c++ - 如何从 C++ 中的类方法正确返回 std::type_info

C++ 使用函数指针重写纯虚函数

C++ - 如何实现 Mask R-CNN?

c++ - g++ 为 std::bitset 分配内存不足