1

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

i) 应使用成员-对象初始化程序来初始化在基类中声明的数据成员,例如 var1。

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

iii) 基类是一个抽象类,它的对象不能被创建。但是,我有第三节课,在其中,我使用:

baseClass *baseObjects[5];

编译器不报告错误。

不明白 i) 和 ii) 的真正含义。用简单的话来解释就好了。此外,欢迎对 iii) 提供任何帮助。

4

4 回答 4

3

问题 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/

我认为这种方式不仅仅是回答你的问题,你可以理解发生了什么,

于 2012-09-14T18:22:26.273 回答
2

我认为最好有插图。

一世)

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++ 中得以实现。

于 2012-09-14T18:15:20.417 回答
2
#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 类通过调用 Base 类构造函数来初始化。析构函数上的 = 0 确保 Base 类是纯虚拟的,因此我们无法实例化它(参见 main 中的注释)。

于 2012-09-14T18:18:32.923 回答
2

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可以指向 aParrotSparrow实例,因为它们都是鸟。

于 2012-09-14T18:22:01.143 回答