【问题标题】:Not calling parent's class constructor in derived class in c++在 C++ 的派生类中不调用父类的构造函数
【发布时间】:2022-01-12 16:04:51
【问题描述】:

我有一个我无法解决的问题。 我正在创建一个 cd 类。这张 cd 上保存了 10 个字符项目。构造函数完成表格。

class CD {
 protected:
     char* data_ = new char[10];
     bool* is_in_ = new bool;
 public:
     CD() {
         for (int i = 0; i < 10; i++) {
             cout << "Podaj znak: ";
             cin >> data_[i];
        }
     }

接下来我要创建一个可以保存 20 个字符项的子类。

class BR : public CD {
 protected:
    char* improve_data_ = new char[20];
 public:
    BR() {
        for (int i = 0; i < 20; i++) {
            cout << "Podaj znak(BR): ";
            cin >> improve_data_[i];
        }
    }

我的问题是,当我创建一个 BR 对象时,它会自动调用 cd 构造函数,BR 对象调用 cd 构造函数和它自己的构造函数。我的问题是可以不调用父构造函数吗?

【问题讨论】:

  • 不,不是。你为什么要这个?您要解决的问题是什么?
  • 当您只需要声明char data[10]; 时,为什么还要使用new[]bool *is_in; 也一样——为什么不简单地 bool is_in;?
  • 即使可以不调用基本构造函数,派生类中仍然有数据和 is_in。您应该开始考虑一般的继承。派生类包含来自基类的 ALL 以及另外在派生类中定义的。并且要初始化基类元素,调用基类构造函数是绝对必要的。

标签: c++ class constructor derived-class


【解决方案1】:

这不是不可能的。如果BR 继承自CD,则BR 的每个实例都有一个CD 实例,需要将其构造为BR 实例的一部分。您可以使用不同的构造函数,但您应该为输入运算符提供重载,而不是强制对象的每个构造都读取用户的输入。

std::istream& operator>>(std::istream& in, CD& cd) {
    for (int i = 0; i < 10; i++) {
         cout << "Podaj znak: ";
         cin >> cd.data_[i];
    }
}


std::istream& operator>>(std::istream& in, BR& br) {
    for (int i = 0; i < 20; i++) {
        cout << "Podaj znak(BR): ";
        cin >> br.improve_data_[i];
    }
}

这些操作员需要成为类的朋友才能访问私有成员。

但是,如果两个类之间的唯一区别是数组中的项目数,您也可以放弃继承并改用std::vector。另一个问题是您无缘无故地使用动态分配。您应该删除任何newbool 成员应该是 bool 而不是 bool*。并且对数组使用动态分配也与拥有两个不同的类相矛盾。选择一个:要么使BRCD 成为两种不同的类型,一种具有大小为10 的静态数组,另一种具有大小20 使用动态分配(通过std::vector ) 但两者都不是声音设计。

【讨论】:

  • 这似乎是一个很好的解决方案,非常感谢。
  • 是的,如果其他一切都应该正常工作,请使用std::vector - 如果不是 - 这两个类不应该是父类和子类,而应该是公共基类的两个兄弟姐妹。在计算机科学中,持有 20 个值并不是持有 10 个值的特例。
猜你喜欢
  • 2015-08-18
  • 2020-11-28
  • 2018-07-16
  • 2016-07-19
  • 1970-01-01
  • 2012-11-06
  • 2020-09-22
  • 1970-01-01
  • 2015-06-12
相关资源
最近更新 更多