2017-05-01 13 views
0

基本クラスには、同じ基本オブジェクト(ポインタではない)を返す仮想メソッドがいくつかあります。いくつかの仮想オーバーライドでは、派生したオブジェクトをベースとして戻したいと思います。しかし問題は、そのメソッドが常に派生した戻り値から基本オブジェクトを作成することです。仮想メソッドから基底として派生オブジェクトを返す

Derived 
Base 

どのようにそれを修正するために:出力

#include <iostream> 
#include <string> 

class Base { 
public: 
    Base() {} 
    virtual std::string myName() { return "Base"; } 
    virtual Base createAlike() { return Base(); } 
}; 

class Derived : public Base { 
public: 
    Derived() : Base() {} 
    std::string myName() override { return "Derived"; } 
    Base createAlike() override { return Derived(); } 
}; 

int main() { 
    Derived d; 
    Base d1 = d.createAlike(); 
    std::cout << d.myName() << std::endl; 
    std::cout << d1.myName(); 
    return 0; 
} 

:ここでは簡単な例ですか?

答えて

1

戻り値は返された式のコピーです。その戻り値の型は常にBaseなので、Derivedオブジェクトはスライスされます。多型が機能するには、一般的にポインタまたは参照が必要です。

std::unique_ptrを使用して、これを試してみてください:

#include <iostream> 
#include <string> 
#include <memory> 

class Base { 
public: 
    Base() {} 
    virtual std::string myName() { return "Base"; } 
    virtual std::unique_ptr<Base> createAlike() 
    { return std::make_unique<Base>(); } 
}; 

class Derived : public Base { 
public: 
    Derived() : Base() {} 
    std::string myName() override { return "Derived"; } 
    std::unique_ptr<Base> createAlike() override 
    { return std::make_unique<Derived>(); } 
}; 

int main() { 
    Derived d; 
    auto d1 = d.createAlike(); 
    std::cout << d.myName() << std::endl; 
    std::cout << d1->myName(); 
    return 0; 
} 
+0

おかげで、私が必要とされるものを) – Rinat

関連する問題