我对基础派生的阶级关系有这个疑问。
我知道当我们从基类派生一个类时,派生类将拥有有关基类的所有信息。但基类不知道有关派生类的任何信息。
那么,为什么这是可以接受的?
Base *b=new Derived();
而不是
Derived *d=new Base();.
基本上我需要了解第一个声明的必要性?我的意思是,将派生类对象分配给基类指针有什么用?
注意:这不是作业。我正处于学习编程的早期阶段。所以基本上需要理解点点滴滴。如果这是非常基本的问题,请忽略。
答案 0 :(得分:3)
你已回答了自己的问题,但我觉得令人困惑的是指针
Derived *d=new Base();
派生类将包含有关基类的所有信息。但 基类对派生类没有任何了解。
是的,所以你期待,因为它被声明为派生Derived *d
,它应该知道关于base的一切。但重要的是实际创造的东西。在这种情况下,您创建了基础new Base();
而Derived
可能已向Base
添加了更多内容,因此我们无法使用Base作为派生。
然而在这种情况下
Base *b=new Derived();
创建一个新的Derived。但我们只对它从Base继承的内容感兴趣。哪个没关系。
因为Derived知道什么是基础
答案 1 :(得分:3)
当创建Derived
类对象时,首先调用Base
类构造函数。 Derived
类对象包含Base
类对象。这允许它调用其Base
函数。而Base
类对象不包含Derived
类对象
Base *b=new Derived();
在您可以使用单个函数处理所有派生类对象的情况下非常有用。
考虑,
父类:动物 派生类:狗,猫等
现在,你有一个功能
void doSomethingtoTheAnimal(//take Animal here);
如果不允许将基类对象分配给父引用变量。您必须为Dog
,Cat
创建单独的函数,依此类推。
void doSomethingtoTheAnimal(Cat *b) or void doSomethingtoTheAnimal(Dog *b)
但是,使用多态性,您可以使用void doSomethingtoTheAnimal(Base *b);
然后就可以
Base *b1 = new Dog()
或Base *b2 = new Cat();
并使用相同的函数doSomethingtoTheAnimal(b1)
或doSomethingtoTheAnimal(b2)
此外,指向派生类对象时的基类指针只能调用父类中的函数或覆盖子类中的函数。它不知道在子类
中专门定义的函数答案 2 :(得分:2)
继承定义了“is-a”关系。如果Derived
将Base
作为基类,那么Derived
就是Base
。
换句话说:每个Derived
对象都可以视为Base
,这使其有效:
Base* b = new Derived();
解除引用b
可以访问Base
个实例的Derived
个部分。
相反,这不起作用,因为Base
不是Derived
。以下内容无效:
Derived* d = new Base(); // NOT VALID