dynamic_cast завершается неудачно, когда приведение производного класса к базовому - PullRequest
1 голос
/ 23 марта 2019

In Primer c ++ 5th

Markdown

class A {
    public:
        A() : a(1) {}
        virtual ~A() = default;
    private:
        int a;
};
class B : public A {
    public:
        B() : b(2) {}
    private:
        int b;
};
class C : public B {
    public:
        C() : c(3) {}
    private:
        int c;
};
//class D : public B, public A {                   cause error
//    public:
//        D() : d(4) {}
//    private:
//        int d;
//};

int main()
{

    //A *pa = new C;
    //B *pb = dynamic_cast<B*>(pa);          //1st case
    B *pb = new B;
    C *pc = dynamic_cast<C*>(pb);        //2nd case
    cout << pc << endl;
    //A *pa = new D;
    //B *pb = dynamic_cast<B*>(pa);        //3rd case
}
//output: 0     cast failure

1:

Здесь в приведенном выше коде. Я могу понять, почему 2-й случай не работает, но тип объекта с указанием pb - B, который является общедоступным базовым классом C. И это вторая ситуация из того, что сказано в Primer c ++.
Так почему второй случай не работает, в то время как учебник для начинающих c ++ сказал, что этот тип приведения будет успешным?

2:

3-й случай. Произошли ошибки при компиляции

error: ‘A’ is an ambiguous base of ‘D’

Что означает эта ошибка?

1 Ответ

2 голосов
/ 23 марта 2019

во втором примере вы создаете класс B, B является базовым классом для C.

, поэтому вы не можете привести базовый класс к некоторому производному классу.

это будет работать:

 B *pb = new C();
 C *pc = dynamic_cast<C*>(pb);

относительно третьего примера D получено из B и A, но B также получено из A, это создает проблемы для компилятора.вы пытаетесь получить 2 раза для A, компилятор не будет знать, какую функцию A использовать, базовую A или производную версию B. al

вам следует прочитать больше о базовых и производных классах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...