0
#ifndef TEST_H
#define TEST_H
#include <iostream>
#include <string>
class A{
public:
    virtual void test1() = 0;
    virtual std::string test2() = 0;
};

class B : public A{

public:
     void test1(){
       std::cout << A::test2() << " World";
    }
};
class C : public B{
public:
     std::string test2(){
        return "hello";
    }
};
class C1 : public B{
public:
     std::string test2(){
        return "Sup";
    }
};

#endif // TEST_H

純粋な仮想メソッドのみを持つインターフェイス A があります。実装して実装するためtest1に使用したい抽象クラスがあります。test2test1

現在、C と C1、および実装する具体的なクラスtest2

でもstd::cout << A::test2() << " World";B級は無理

エラー: オブジェクトなしでメンバー関数 'virtual std::string A::test2()' を呼び出すことはできません

C ++でこのようなことを行うにはどうすればよいですか?

4

4 に答える 4

2

仮想呼び出しが必要な場合は、明示的なスコープ修飾を使用しないでください。Usingは、動的ディスパッチなしでA::test2 を呼び出そうとします。これは、実装がないA::test2ため、リンクに失敗します。A::test2

于 2013-05-07T10:53:21.223 に答える
2

class Bから継承する必要がありますclass A

class B: public A ... 

もちろん、A::test2()そのクラスは実装されていないため、呼び出しは機能しません-本体がありません。次のように、クラス A にも実装することで解決できます。

std::string A::test2() { return "some string"; }
于 2013-05-07T10:44:39.027 に答える