2016-06-24 6 views
1

抽象クラスのオブジェクトを作成することはできません。では、抽象基本クラスと派生クラスの両方に定義された仮想関数をどのように呼び出すことができますか?私は抽象基本クラスでコードを実行したいが、現在、私は派生クラスのオブジェクトを使用しています。C++の抽象基本クラスと派生クラスの両方の定義を持つ基本クラスの仮想関数定義をどのように呼び出すことができますか?

class T 
{ 
    public: 
    virtual int f1()=0; 
    virtual int f2() { a = 5; return a } 
} 
class DT : public T 
{ 
    public: 
    int f1() { return 10; } 
    int f2() { return 4; } 
} 

int main() 
{ 
    T *t; 
    t = new DT(); 
    ............ 
} 

オブジェクトtを使用して基本クラス関数を呼び出す方法はありますか?可能でない場合は、基本クラス関数を呼び出すために何をする必要がありますか?

+1

http://stackoverflow.com/を呼び出しますhelp/mcve –

+0

@RichardCritten一般的には便利ですが、公平であるためには、コードのOPの説明はそのままの状態で理解するのに十分です。 – Angew

答えて

4

をあなたが他の基本クラスの実装を呼び出すのと同じように:ダイナミックディスパッチメカニズムをバイパスするために、明示的な資格を使用します。抽象基底クラスはいくつかのコードを持っている場合

struct AbstractBase 
{ 
    virtual void abstract() = 0; 

    virtual bool concrete() { return false; } 
}; 

struct Derived : AbstractBase 
{ 
    void abstract() override {} 

    bool concrete() override { return true; } 
}; 

int main() 
{ 
    // Use through object: 
    Derived d; 
    bool b = d.AbstractBase::concrete(); 
    assert(!b); 

    // Use through pointer: 
    AbstractBase *a = new Derived(); 
    b = a->AbstractBase::concrete(); 
    assert(!b); 
} 
+0

追加されたコードを確認してください。 – aaroh

+2

@aarohそれはコンパイルさえしません。おそらくそれは 'T * t;だったはずですか?もしそうなら、単に 't-> T :: f2()'を実行してください。正しいコードを持つように質問を編集してください。 – Angew

1

関数を呼び出すときは、明示的に、クラスのスコープを指定することができます。

class A { /* Abstract class */ }; 
    class B : public A {} 

    B b; 
    b.A::foo(); 
1

、そしてちょうどBaseClassName :: AbstractFunction()、最小完全、かつ検証例を作成する方法

class Base 
{ 
    virtual void Function() {} 
} 

class Derived : Base 
{ 
    virtual void Function() { Base::Function(); } 
} 
関連する問題