他の 2 つのクラス ('TestA' と 'TestB') から派生したクラス ('TestC') があります。どちらも同じ署名を持つ仮想関数を持っています。
「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"
誰かが私にこれを説明できますか?「テスト」が突然仮想ではなくなったように見えますか? 関数を明示的に上書きせずにこれを行う方法はありますか? (「オーバーライドを使用する」のようなもの)