1

仮想メソッドは常に派生クラスで実装する必要がありますか?
このようなことを書いてもいいですか?

<!-- language: lang-cpp -->
class BaseInterface 
{
public:
   virtual void fun_a() = 0;
   virtual void fun_b() = 0;
   virtual ~BaseInterface(); 
};

class Derived : public BaseInterface
{
   void fun_a() { ... };
};

class FinalClass : public Derived
{
   void fun_b() { ... };
}

int main()
{
   FinalClass test_obj;
   test_obj.fun_a();  // use Derived implementation or fail ???
   test_obj.fun_b();  // use own implementation 
   BaseInterface* test_interface = new FinalClass();
   test_interface->fun_a(); // fail or ok ???
   test_interface->fun_b(); 
}

上記のコードは正しいですか?
別の仮想メソッドoutflankは存在しますか?

4

3 に答える 3

0

コードは正しいです。C++のインターフェースには特別な概念はありません。すべてクラスです。一部のクラスメソッドは、純粋な仮想にすることができます。これは、コンパイラがそのようなクラスのインスタンスを作成できないことを意味するだけです。

于 2013-03-05T12:09:39.847 に答える
0

また、Derivedインスタンス化できない抽象クラスも作成します。そのベースからすべてのvirtual関数を実装しないと、直接インスタンス化できない抽象クラスになります。

こちらをご覧ください: liveworkspace.org/code/6huYU$10

残りは、コードが機能するはずです。

于 2013-03-05T12:06:27.950 に答える
0

純粋仮想メソッドは常に派生クラスで再実装する必要がありますか?

実際には、インスタンス化される派生クラスです。

あなたのコードでは、オブジェクトを作成していないので問題ありませんDerived

このようなことを書いてもいいですか?

はい。

あなたは私がそれらを修正したいくつかの小さなエラーを持っていました:

class BaseInterface
{
public:
    virtual void fun_a() = 0;
    virtual void fun_b() = 0;

    virtual ~BaseInterface() {};  // You forget this
};

class Derived : public BaseInterface
{
public:
    void fun_a() {}  // This should be public as its base
};

class FinalClass : public Derived
{
public:
    void fun_b() {} // This should be public as its base
};

int main()
{
    FinalClass test_obj;
    test_obj.fun_a();
    test_obj.fun_b();
    BaseInterface* test_interface = new FinalClass();
    test_interface->fun_a();
    test_interface->fun_b();
}
于 2013-03-05T12:02:51.000 に答える