0

私たちが持っているとしましょう

class Base
{
public:
    virtual void foo(){}
};

class Derived: public virtual Base
{};

class Derived_Left: public Derived
{};

class Derived_Right: public Derived
{};

class Bottom: public Derived_Left, public Derived_Right
{};

//ケースについて議論しましょう

// ケース 1:

void foo()
{
    Base *bptr = new Bottom;
    Derived *dPtr = dynamic_cast<Derived*>(bptr);//dptr == 0
}

// ケース 2:

void goo()
{
    Bottom *bptr = new Bottom;
    Derived *ddtr = dynamic_cast<Derived*>(bptr); // ERROR
}

//main.cpp: 関数 'void goo()' 内:

//main.cpp:36:49: エラー: 'Derived' は 'Bottom' のあいまいなベースです</p>

int main()
{
}

では、なぜコードがコンパイルされるのか

Base* bptr = new Bottom; 

の場合ではありません

Bottom* bptr = new Bottom; 
4

1 に答える 1

-1

あなたはすでに同じ質問をしました。手短に答えます。それはダイヤモンドの問題です。この場合、Type Base のポインターを派生にキャストすると、Base クラスはこの場合の一意の子クラスを認識します。しかし、Bottom 型のオブジェクトの観点からすると、あいまいなので、Derived_left または Derived_Right の親である派生クラスを操作する必要があります。

于 2013-08-20T09:05:04.873 に答える