Inheritance - C++

Inheritance - C++

本文关键字:C++ Inheritance      更新时间:2023-10-16

我正在使用一个类,比如baseClass,从中派生出另一个类derivedClass。我有一个问题定义,它说,除了其他:

i) 成员对象初始化器应该用于初始化基类中声明的数据成员,比如var1。

ii)i)是在基类构造函数内完成的。它说,这只能通过派生类构造函数调用。

iii)基类是一个抽象类,其对象无法创建。但是,我有一个第三类,在里面,我使用:

baseClass *baseObjects[5];

编译器不报告错误。

不明白I)和ii)到底是什么意思。用简单的词语解释就可以了。此外,欢迎在iii)方面提供任何协助。

问题1:了解构造函数:http://www.cprogramming.com/tutorial/constructor_destructor_ordering.html

问题2:阅读初始化列表:
http://www.cprogramming.com/tutorial/initialization-lists-c++.html

问题3:阅读指向派生类的指针:
http://www.learncpp.com/cpp-tutorial/121-pointers-and-references-to-the-base-class-of-derived-objects/

我认为这样你就可以理解发生了什么,而不仅仅是回答你的问题,

我认为插图是最好的。

i)

class A
{
  int i;
 public:
  A(int ii) : i(ii) {}
}

部件i(ii)是成员对象初始化程序的一个示例。由于C++保证在输入构造函数体之前调用所有成员的构造函数,因此这是指定为每个成员调用哪个构造函数的唯一方法。

ii)在C++中不存在super关键字。您必须这样指定基类:

 class B : public A
 {
 public:
   B(int i) : A(i) {}
 }

部分原因是C++允许多重继承。

iii)请注意,您没有创建任何对象,只创建了指向对象的指针。并用这种方法在C++中实现了遗传多态性。

#include <iostream>
class Base
{
public:
    Base(int i)
    {}
    virtual ~Base() = 0
    {}
protected:
    int i_;
};
class Derived: public Base
{
public:
    Derived(int i, int j) : Base(i), j_(j)
    {}
private:
    int j_;
};
int main(int argc, char* argv[])
{
    //Base b(1); object of abstract class is not allowed
    Derived d(1, 2); // this is fine
}

正如您所看到的,i_是由Derived类通过调用基类构造函数初始化的。析构函数上的=0确保基类是纯虚拟的,因此我们不能实例化它(请参阅main中的注释)。

i)以下是所谓的初始化器列表,您可以使用初始化器列表来确保数据成员在输入构造函数之前具有值。因此,在下面的示例中,在您输入构造函数之前,a的值为10。

Class baseClass
{
    int a;
public:
    baseClass(int x):a(x)
    {
    }
}

ii)这就是从派生类构造函数显式调用基类构造函数的方式。

Class derivedClass : public baseClass
{
    int a;
public:
    derivedClass(int x):baseClass(x)
    {
    }
}

iii)不能直接创建抽象类的实例。但是,您可以创建指向抽象基类的指针,并让这些指针指向它的任何具体实现。因此,如果您有一个抽象基类Bird和具体实现ParrotSparrow,那么Bird* bird可以指向ParrotSparrow实例,因为它们都是鸟。