Почему указателю производного класса нельзя присвоить указатель базового класса? - PullRequest
0 голосов
/ 28 марта 2020

Я учусь на C ++ из учебника, но все еще сбиваю с толку

C ++ Программа:

using namespace std;
#include<iostream>

class A
{
public:
    A()
    {
        std::cout << "A\n";
    }
};

class B: public A
{
public:
    B()
    {
        std::cout << "B is derived class\n";
    }
};


int main()
{

    A * a=new A();  //valid 
    B * b=new B();  //valid

    A * aa=new B(); //valid    why?
    B * bb=new A(); //invalid  why?                                  run time error: invalid conversion from ‘A*’ to ‘B*’ [-fpermissive]

    return 0;
}

эта строка

A * a=new A();  //valid 

использовать, потому что Я хочу для доступа к классу a

и

эта строка

B * b=new B();  //valid 

используется, потому что я хочу получить доступ к классу b

и

Я пишу эту строку с целью обучения, я не знаю, но это действительно так, почему ??

A * aa=new B();  //valid

и

I Я пишу эту строку, цель обучения, которую я не знаю, но это неверно, почему ??

B * bb=new A(); //not valid

объясните, пожалуйста, последние две строки все еще путаница?

ссылка на программу: https://onlinegdb.com/Sy8xkt38L

1 Ответ

3 голосов
/ 28 марта 2020

Это

class B: public A

фактически говорит, что все B являются A, Это как

class Lion : public Animal

говорит, что все львы - животные .

Так это нормально

Animal* a = new Lion(); 

, потому что все львы - животные. Можно с уверенностью предположить, что лев это животное. Но это не хорошо

Lion* l = new Animal(); 

, потому что не все животные - львы . Вы не можете взять любое старое животное и притвориться, что это лев.

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