【问题标题】:derived class constructor call base constructor派生类构造函数调用基构造函数
【发布时间】:2018-07-21 13:40:21
【问题描述】:

我有一个基类 Array 和一个派生类 NumericArray

class Array{//Array.h
private: int size;

public: Array();//Default constructor
        Array(int index);// Initialize with size
        GetSize();//getter function
};

class NumericArray:public Array
{//NumericArray.h

public: NumericArray();//Default constructor
        NumericArray(int index);// Initialize with size
};

我知道如何调用 NumericArray 类中的默认 Array 构造函数。但是当谈到 NumericArray(int index) 时,我不知道。由于派生类无法访问基类中的大小,我认为我应该在基类中使用 getter 函数。但是我该怎么做呢?

谢谢。

【问题讨论】:

  • 不是您的问题,但请注意,可变数组不太适合普通继承。例如。 std::unique_ptr 专门用于数组,不允许向上或向下转换。当然,这取决于基类 Array 提供的功能,但如果它不提供任何类似数组的功能,它可能一开始就不应该存在。
  • 缺少的分号表明显示的代码不是真正的代码。请务必发布真实代码。
  • 我看到这里提出了一个暗淡的、非常暗淡的实际问题:是的,在派生类构造函数的主体中,因为现在已经完全构造了基类,您可以从派生类的构造函数。
  • 即使对基类的构造函数和析构函数的访问没有被继承,它们也会被派生类的构造函数和析构函数自动调用。

标签: c++


【解决方案1】:

由于size是基类Array中的private变量,所以在子类NumericArray中无法访问。

在子类NumericArray中访问size有两种方式:

  1. size 设为基类Array 中的受保护变量,并在子类NumericArray 中访问它。

    protected: int size;
    
  2. 在返回size的基类Array中写一个getter公共函数(GetSize()),子类NumericArray可以在子类的构造函数中调用这个getter公共函数使用super.GetSize() 每个this link 的类。

    public:
        GetSize() { return size }
    

【讨论】:

  • 谢谢,我也觉得应该用getter函数。请问怎么用?写完这个函数后,如何在 NumericArray.cpp 的构造函数中调用 GetSize()?
  • @Yifan 如果您认为我的回答有用,请点赞!基类中的GetSize() 可以在子类NumericArray 中使用super.GetSize()docs.oracle.com/javase/tutorial/java/IandI/super.html 调用。
【解决方案2】:

只要派生类实例化了一个对象,您就可以调用基类的构造函数。您可以使用类似于 member-init 的东西相对轻松地做到这一点:

class Base
{
private:
    int size;
public:
    Base(int param) { size = param;}
    //rest of the code here
};

class Derived : public Base
{
private:
   //other data members
public:
    Derived(int param): Derived(param) { //set rest of data}
};

这会将param 传递给Base 的构造函数,并让它做任何事情。 Derived 不需要直接访问Base 中的size,因为它可以使用已经存在的东西来处理它。如果您想要更深入的解释和示例,Here 是一个很好的解释。 (滚动大约 2/3 到构造函数)

【讨论】:

    猜你喜欢
    • 2016-07-19
    • 2015-08-18
    • 2018-07-16
    • 2022-12-03
    • 2020-11-28
    • 1970-01-01
    • 2013-01-28
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多