4

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

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

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

Base *b=new Derived();

并不是

Derived *d=new Base();.

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

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

4

3 回答 3

5

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)

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

于 2013-04-08T13:04:12.357 回答
4

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

Derived *d=new Base();

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

是的,所以你期待,因为这是声明为派生的Derived *d,它应该知道关于基础的一切。但重要的是实际创造了什么。在这种情况下,您创建了 Basenew Base();并且Derived可以添加更多内容Base,因此我们不能将 Base 用作 Derived。

然而在这种情况下

Base *b=new Derived();

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

因为 Derived 知道 base 中的内容

.

于 2013-04-08T12:59:15.587 回答
2

继承定义了“is-a”关系。如果DerivedhasBase作为基类,则Derivedis-a Base

换句话说:每个Derived对象都可以被视为一个Base,这使得它有效:

Base* b = new Derived();

取消引用b允许访问实例的Base各个部分。Derived

这反过来不起作用,因为 aBase不是 a Derived。以下内容无效:

Derived* d = new Base(); // NOT VALID
于 2013-04-08T12:58:14.783 回答