为什么不能为派生类指针分配基类';指针? 我从课本中学习C++,但仍然困惑<

为什么不能为派生类指针分配基类';指针? 我从课本中学习C++,但仍然困惑< ,c++,inheritance,C++,Inheritance,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() {

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 * a=new A();  //valid 
B * b=new B();  //valid 
使用,因为我想访问b类

我写这行的学习目的我不知道,但这是有效的为什么

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

我写这行的学习目的我不知道,但这是无效的,为什么

A * aa=new B();  //valid
B * bb=new A(); //not valid
请解释一下最后两行还不清楚

节目链接:

class B: public A
实际上说所有的B都是A,就像

class Lion : public Animal
说所有的狮子都是动物

这没关系

Animal* a = new Lion(); 
因为所有的狮子都是动物。假设狮子是一种动物是安全的。但这不好

Lion* l = new Animal(); 

因为不是所有的动物都是狮子。你不能拿任何老动物假装它是狮子。

B*bb=new a()//无效原因?
-因为A不是B。听起来你需要A。“is-a”关系是一个非常基本的OOP概念。将
a
替换为
Shape
,将
B
替换为
矩形
。矩形是一个形状,但形状不一定是矩形。要加上@L.F.的注释:作为初学者,您不应该使用
new
来分配对象。使用现代C++,这只能在非常具体的情况下使用。仅与
A实例关联@L.F.根据第一句话,他们已经有一本书了。(好与否,我不知道。如果它以
new
开头,可能不会)