【问题标题】:C++ Inherit constructor and extend its functionalityC++ 继承构造函数并扩展其功能
【发布时间】:2021-09-24 11:02:35
【问题描述】:

我有一个基类,我想从中继承它的构造函数,但我想在子类中为构造函数添加更多内容。具体来说,我想在构造函数的末尾运行一个函数,比如 ExtraSetup(),它会执行一些与子类相关的初始化。有什么好的方法可以做到这一点?

这是一个简化的示例。我希望子类的 ExtraSetup() 在初始化子类对象时运行。请注意,我不一定要使用此“使用 Base::Base;”和虚函数。如果有更简单的方法就更好了。

#include <iostream>

using namespace std;


class Base {
    protected:
        int base_number_;
        
        virtual void ExtraSetup(){
            cout << "This should NOT run" << endl;
        }
        
    public:
        Base(int number){
            base_number_ = number;
            ExtraSetup();  
        }
};


class Sub : public Base {
    public:
        using Base::Base;
    private:
        int sub_number_;
        
        void ExtraSetup(){
            sub_number_ = 200;  // some random extra setup
            cout << "This should run" << endl;
        }
};


int main()
{
    Sub sub_object(100);
    return 0;
}

【问题讨论】:

  • 问题不清楚。请显示有问题或无法按预期方式工作的代码。
  • 你问的不是继承类的自然行为吗?当您创建派生类的实例时,将首先调用基类的构造函数。所以你放在派生类的构造函数中的任何东西都会跟随它。
  • 您要求的是推导的基本机制。您没有继承构造函数,而是继承了一个类,该类的构造函数需要在其初始化列表中调用它的父构造函数。 Here is an example of what you asked for
  • 此外,如果 "ExtraSetup()" 应该只是进行子类成员初始化,我建议您删除此函数并改用构造函数的初始化列表,它会更高效(除非您的成员初始化不是微不足道的)。
  • 编辑 - 添加代码示例。 @Fareanor 在我的真实用例中,ExtraSetup() 将 csv 文件读入一个向量(循环),它是子类成员。我想这不是微不足道的,就像直接分配一个成员一样。

标签: c++ oop constructor


【解决方案1】:

你也可以从你的“成员”部分继承:

class Base {
public:
    // Several constructors
    // We don't want to duplicate those in Derived class
    Base(int number);
    Base(int, int);
    Base(std::string);
};

class Member
{
protected:

    Member()
    {
       // some random extra setup
       std::cout << "This should run" << std::endl;
    }
};

class Derived : public Base, protected Member
{
public:
    int sub_number_ = 200; // If this kind of initialization is sufficient
                           // You might simply use it instead of inheritance
public:
    using Base::Base;
};

【讨论】:

  • 我需要的不仅仅是简单的初始化。 ExtraSetup() 打开一个 csv 文件,根据一些逻辑从中读取值,创建一个 vector<:point>,然后将其分配给子类的成员变量。是否可以不从 2 个类继承?
  • CsvData csvData = OpencsvFile(somePath);?
  • 是的,在我的情况下,这可能是最好的解决方案。谢谢!虽然,就软件设计而言,我更愿意通过类的构造函数来运行我的所有初始化。虽然我不是很有经验,所以也许这不是一个好方法。
  • 那些成员初始化是在构造函数中完成的,(和在初始化时),而你在构造函数体中(间接地)进行赋值。
猜你喜欢
  • 1970-01-01
  • 2018-09-29
  • 2019-01-21
  • 2012-11-14
  • 2021-06-24
  • 2015-03-24
  • 2014-08-21
  • 2017-08-09
  • 1970-01-01
相关资源
最近更新 更多