2017-12-19 25 views
0

の機能に派生クラスを渡す:私はこのコードを持って、基本クラスの引数

#include <iostream> 

class Base { 
    public: 
    virtual void sayHello() { 
    std::cout << "Hello world, I am Base" << std::endl; 
    } 
}; 

class Derived: public Base { 
    public: 
    void sayHello() { 
    std::cout << "Hello world, I am Derived" << std::endl; 
    } 
}; 

void testPointer(Base *obj) { 
    obj->sayHello(); 
} 

void testReference(Base &obj) { 
    obj.sayHello(); 
} 

void testObject(Base obj) { 
    obj.sayHello(); 
} 

int main() { 
    { 
    std::cout << "Testing with pointer argument: "; 
    Derived *derived = new Derived; 
    testPointer(derived); 
    } 
    { 
    std::cout << "Testing with reference argument: "; 
    Derived derived; 
    testReference(derived); 
    } 
    { 
    std::cout << "Testing with object argument: "; 
    Derived derived; 
    testObject(derived); 
    } 
} 

出力は次のとおりです。

Testing with pointer argument: Hello world, I am Derived 
Testing with reference argument: Hello world, I am Derived 
Testing with object argument: Hello world, I am Base 

私の質問は、ポインタケースvoid testPointer(Base *obj)と基準ケース理由でもあるvoid testReference(Base &obj)void sayHello()の派生インスタンスの結果を返しますが、コピーケースによるパスは返しませんか?派生クラス関数void sayHello()の結果を返すようにコピーケースを作成するにはどうすればよいですか?

+1

「参照引数でテストする」は、「testReference」ではなく「testObject」を呼び出します。 –

+3

[オブジェクトのスライシングとは何か?](https://stackoverflow.com/questions/274626/what-is-object-slicing) –

+0

@RaymondChenそのおかげで、参照事例がポインタとして機能していることがわかりました。しかし、おそらく、派生クラス関数の実装を呼び出す方法はありません。 – Pekov

答えて

1

リファレンスまたはポインタをとる関数は、渡された元のオブジェクトを参照し、by-value引数はオブジェクトのコピーを作成します。基底部分をコピーするだけなので(基底オブジェクトを取るので)基底部分のコピーを扱うことになり、は基底のように機能し、基底はです。

この「ベースオンリー」コピーは、オブジェクトの一部だけをコピーし、派生パーツをスライスするため、「スライス」と呼ばれます。

関連する問題