当前位置: 首页 > 知识库问答 >
问题:

声明一个继承的构造函数?

苏野
2023-03-14

我在为继承另一个类属性的类定义构造函数时遇到困难

class Transportation {

public:
    int ID;
    string company;
    string vehicleOperator;

    Transportation(int,string,string) {
    }
};

class SeaTransport: public Transportation {

public:
    int portNumber;

    SeaTransport(int)::Transportation(int,string,string) {
    }
};

我在第 18 行(SeaTransport(int)::Transport(int,string,string))方面遇到了问题。

我收到的错误发生在我申报< code >运输的地点。

如代码所示,运输类是主体类,类海上运输继承运输的属性。

Transportation::Transportation(int, std::string, std::string)
+2 overloads

type name is not allowed

这个错误发生在int

typedef std::__cxx11::basic_string std::string
type name is not allowed

最后一个错误发生在两个字符串变量上。

共有2个答案

赵选
2023-03-14

正如某个程序员花花公子先生所说,您的代码中存在Scope问题,我将尝试回答您的第二个问题,即如何在构造函数上添加特征变量。

与您对port属性所做的相同。

您可以在所有属性(即boatNumber)之前将其定义为int boadNumber=0,然后,您将在初始值设定项运算符之后使用boatNumber(num)重载构造函数,在初始值设置项运算符之前使用int num

class Transportation {

public:
    int ID;
    string company;
    string vehicleOperator;

    Transportation(int,string,string) {
    }
    ~Transportation(){}
};

class SeaTransport: public Transportation {

public:
    int portNumber;
    int boatNumber;

   SeaTransport(int num, int port, int id, string company, string oper)
   :Transportation(id, company, oper), boatNumber(num),portNumber(port)  {}

   ~SeaTransport(){}
};

但是,如果你想得到更具体的东西,你可以创建另一个派生自SeaTransport的类,然后你将定义你的船的编号和更多其他细节,如果你想要的话。

我给你举个例子:

 class Boat: public SeaTransport {

    public:

        int boatNumber;

        Boat(int bNum,int num, int port, int id, string company, string oper):
SeaTransport( num, port, id, company, oper),boatNumber(bNum){}

        ~Boat(){}
    };
易宣
2023-03-14

看起来你把作用域和构造函数初始化列表混在了一起。

双冒号操作符< code>::用于作用域,而构造函数后跟一个冒号和一个初始化列表是一个初始化列表。

您必须声明SeaTransport构造函数以接受所有参数,包括父类的参数(假设要将它们传递给基构造函数):

SeaTransport(int port, int id, string company, string operator);

然后在构造函数的定义(实现)中,在构造函数初始值设定项列表中“调用”父构造函数:

SeaTransport(int port, int id, string company, string oper)
   : Transport(id, company, oper), // "Call" the parent class constructor
     portNumber(port)  // Initialize the own members
{
}
 类似资料:
  • 人们有时会对类成员函数或成员变量的作用域问题感到困惑,尤其是,当基类与派生类的同名成员不在同一个作用域内时: struct B { void f(double); }; struct D : B { void f(int); }; B b; b.f(4.5); // OK // 调用的到底是B::f(doube)还是D::f(int)呢? // 实际情况往往会让人感到意外

  • 问题内容: 在为期末考试而学习时,我在正在学习的书中遇到了以下陈述。考虑以下代码: 是否必须在类B(super(x))的构造函数中调用类A的构造函数。本书指出这不是强制性的,因为它们具有确切数量和类型的参数。但是,当我在Java编译器中尝试此操作时,会抛出以下错误: 类A中的构造函数A不能应用于给定类型;必需:发现整数:无参数原因:实际和正式参数列表的长度不同 问题答案: 编译器会自动插入开头。

  • 问题内容: 我想知道为什么在Java中不继承构造函数?你知道当你上这样的课时: 稍后当你从继承时Super,java会抱怨没有定义默认的构造函数。解决方案显然是这样的: 这段代码是重复的,而不是干的和无用的(IMHO)…因此再次带来了问题: 为什么Java不支持构造函数继承?不允许这种继承有什么好处? 问题答案: 假设构造函数是继承的…则因为每个类最终都派生自Object,所以每个类最终都将带有无

  • 问题内容: 我想要一个构造函数,其参数会自动被所有子类继承,但是Java不允许我这样做 我不希望有写,等等。每个子类。有没有更聪明的方法来解决这个问题? 解决方案#1。构造一个可以在构造函数之后调用的方法。尽管对我的特定设计而言,这是可行的,但是我希望要求用户在构造函数中指定在编译时经过验证的某些参数(例如,不通过varargs / reflection)。 问题答案: 你不能 如果要在基类中有一

  • 我有一个继承自父类Point的子类行,我没有在子类中使用基类的构造函数,但是我得到了这个错误: '形状。点“不包含接受0个参数的构造函数 这是我的父类: 这是我的孩子班:

  • 见 映射类继承层次结构 对于这个部分。