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

Posted

技术标签:

【中文标题】C ++声明一个继承的构造函数?【英文标题】:C++ Declaring an inherited constructor? 【发布时间】:2020-05-12 04:41:48 【问题描述】:

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

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)::Transportation(int,string,string))。

我收到的错误发生在我声明 Transportation 的桥上。

从代码中可以看出,Transportation 类是主体类,SeaTransport 类继承了Transportation 的属性。

运输::运输(int, std::string, std::string) +2 过载 不允许使用类型名称

这个错误发生在 int 处

typedef std::__cxx11::basic_string std::string 不允许使用类型名称

这个最终错误发生在两个字符串变量上。

【问题讨论】:

您使用的语法没有多大意义。您只需要在派生类中声明一个构造函数,并且在定义中您需要确保调用基类构造函数,您还需要为函数调用提供实际值:SeaTransport(int input) : Transportation(input,"","") 在函数声明的情况下,单独提供参数的类型就足够了。但是在定义函数时,您需要提供将存储数据的变量。 FWIW(虽然可能不严格相关):ret Class::method(..).. 风格的成员定义需要在类声明之外;并且通常在非标题 .cc 文件中。对于内联成员定义,删除 Class:: 位。这也适用于构造函数。 【参考方案1】:

您似乎将范围界定和构造函数初始化列表混合在一起。

双冒号运算符:: 用于范围,而后跟冒号和初始化列表的构造函数是初始化列表。

您必须声明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


【讨论】:

您不必在派生类中获取任何参数,您必须向基类提供构造函数的所有参数。例如,您可以使用 Transport(0,"","") 调用它【参考方案2】:

正如 Some Programmer Dude 先生所说,您的代码中存在 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 的类 然后,如果需要,您将定义 boat 的编号和更多其他详细信息。

我会给你画一个例子:

 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()
    ;

【讨论】:

以上是关于C ++声明一个继承的构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

继承构造函数是不是适用于 C++0x 中的模板?

如何在C ++中的另一个类中声明一个类的构造函数

从函数返回对象时调用C ++中的复制构造函数?

构造函数、ECMAscript(ES6)

Kotlin类与继承

关于JS原型原型链继承的问题