基派生类关系

Uma*_*ack 5 c++ inheritance

我对基派生类的关系有这样的疑问。

我知道当我们从基类派生一个类时,派生类将拥有有关基类的所有信息。但基类对派生类一无所知。

那么,为什么这是可以接受的呢?

Base *b=new Derived();
Run Code Online (Sandbox Code Playgroud)

并不是

Derived *d=new Base();.
Run Code Online (Sandbox Code Playgroud)

基本上我需要理解第一个声明的需要?我的意思是,将派生类对象分配给基类指针有什么用?

注意:这不是作业。我正处于学习编程的早期阶段。所以基本上需要了解点滴。如果这是非常基本且已被问到的问题,请忽略。

Suv*_*yil 5

Derived创建类对象时Base,首先调用类构造函数。类Derived对象包含Base类对象。这允许它调用它的Base函数。而Base类对象不包含Derived类对象

在此输入图像描述

Base *b=new Derived(); 
Run Code Online (Sandbox Code Playgroud)

在可以使用单个函数处理所有派生类对象的情况下非常有用。

考虑,

父类:动物 派生类:狗、猫等

现在,你有一个函数

void doSomethingtoTheAnimal(//take Animal here);

如果不允许将基类对象分配给父引用变量。您必须为DogCat等创建一个单独的函数。

void doSomethingtoTheAnimal(Cat *b) or void doSomethingtoTheAnimal(Dog *b)
Run Code Online (Sandbox Code Playgroud)

但是,通过多态性,您可以使用void doSomethingtoTheAnimal(Base *b);然后您可以做

Base *b1 = new Dog()或者Base *b2 = new Cat();

并使用相同的功能doSomethingtoTheAnimal(b1)doSomethingtoTheAnimal(b2)

此外,基类指针指向派生类对象时只能调用父类中的函数或子类中重写的函数。它不知道在子类中专门定义的函数


小智 4

你已经回答了你自己的问题,但我认为让你困惑的是指针

Derived *d=new Base();
Run Code Online (Sandbox Code Playgroud)

派生类将拥有有关基类的所有信息。但基类对派生类一无所知。

是的,所以您期望,因为它被声明为派生的,所以Derived *d它应该知道有关基数的所有信息。但重要的是实际创建的内容。在本例中,您创建了 Basenew Base();并且Derived可以向 中添加更多内容Base,因此我们不能将 Base 用作 Derived。

然而在这种情况下

Base *b=new Derived();
Run Code Online (Sandbox Code Playgroud)

创建一个新的派生。但我们只对它从 Base 继承的内容感兴趣。没关系。

因为 Derived 知道 base 中的内容