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