3

次のコードは、2 つのクラスから継承するオブジェクトをリストに挿入することに関して問題がありますか?

class A
{
}

class B
{
}

class C : public A, public B
{

}

C *myObj = new C();
std::list<A*> myList;
myList.push_front(myObj);

タイプ A のリストを作成し、タイプ B の一部であるタイプ C のオブジェクトを挿入することは問題がありますか? このコードがコンパイルされることは知っていますが、メモリの問題に悩まされています。問題がある場合、これを解決するために他にどのようなオプションが必要ですか?

4

2 に答える 2

3

リストが参照またはポインタによってデータを格納し、デストラクタが仮想である限り、問題ありません。

基本的な問題は、C を の変数に格納することは許可されていませんが、またはAに格納することはできます。したがって、 C をorに格納するのと同じくらい悪いでしょう。これはスライスにつながりますA&A*A a = C()list<A>vector<A>

于 2012-12-05T18:25:35.110 に答える
0

技術的には、オブジェクトの参照またはポインタをリストに追加して、スライスを回避し、仮想デストラクタを使用する限り、安全です。

AandBは、ポリモーフィック型へのインターフェイスと考えることができます。次の例を見てください。

class Drawable
{
    public:
        virtual ~Drawable() { }
        virtual void draw();
};

class Circle : public Drawable
{
    public:
        void draw() { std::cout << "Drawing a circle\n"; }
}

class Square : public Drawable
{
    public:
        void draw() { std::cout << "Drawing a square\n"; }
}

int main()
{
    std::list<Drawable*> shapeList { new Square(), new Circle(), new Square() };
}
于 2012-12-05T18:43:51.840 に答える