2

B が A から派生するクラス A と B があるとします。その後、オブジェクト クラス A またはオブジェクト クラス B を指すことができるポインター A* があります。オブジェクトはこのポインターによって指されているので、A オブジェクトがあれば A オブジェクトをコピーしたいのですが、B の場合は B をコピーしたいと思います。RTTI と動的キャストは省略したいと思います。それを行う方法を考えていますか?または、仮想クローニング関数のようなものを実装して明示的に呼び出す必要がありますか?

4

2 に答える 2

4

仮想関数の複製は、このための最も典型的なアプローチです。たとえば、

class Base {
    public: virtual Base* clone() { return new Base(*this); }
};

class Derived : public Base {
    public: virtual Base* clone() { return new Derived(*this); }
};

ただし、ポインターを持っていてそれを複製すると、それ派生していることを知っていてDerivedも、突然ポインターが作成されることがあります。固有のメンバーにアクセスする場合は、ダウンキャストが必要です。BaseDerived

C++98 標準によれば、実際には戻り値の型を派生型に変更できます。

class Base {
    public: virtual Base* clone() { return new Base(*this); }
};

class Derived : Base {
    public: virtual Derived* clone() { return new Derived(*this); } //will overload Base::clone
};
于 2013-08-21T17:05:50.290 に答える
0

メンバーごとのコピーの単純なケースでは、簡単に見えます。

#include<iostream>
using namespace std;

class A{
public:
    ~A(){}
    A() : _x('A') {}
    void foo() { cout << _x << endl; }   
protected:
    char _x;    
};

class B : public A{
public:
    ~B(){}
    B() { _x = 'B';}
};

int main()
{
    A* a = new A();
    A* b = new B();

    A* c(a);
    c->foo();  //A

    A* d(b);
    d->foo();   //B

    delete a,b;
}
于 2013-08-21T17:56:37.913 に答える