在C++;派生类(参数比它的基类多)能否使用基类函数和重载运算符? 我对C++类很陌生,所以这个问题对于一些人来说可能看起来很愚蠢,但是我想知道我们是否可以在派生类中使用基类函数,就像我们使用构造函数一样?

在C++;派生类(参数比它的基类多)能否使用基类函数和重载运算符? 我对C++类很陌生,所以这个问题对于一些人来说可能看起来很愚蠢,但是我想知道我们是否可以在派生类中使用基类函数,就像我们使用构造函数一样?,c++,class,inheritance,constructor,C++,Class,Inheritance,Constructor,据我所知,基类的构造函数可以在派生类中使用,而无需反复复制相同的代码行,只需稍微修改构造函数以适应派生类的其他参数。 例如: class parent{ protected: char *p; public: parent() { p=NULL; } parent(char ch[10]) { /// initialization for p with ch (p=ch); } /// ot

据我所知,基类的构造函数可以在派生类中使用,而无需反复复制相同的代码行,只需稍微修改构造函数以适应派生类的其他参数。 例如:

class parent{

protected:

    char *p;

public:

    parent()
    {
        p=NULL;
    }

    parent(char ch[10])
    {
       /// initialization for p with ch (p=ch);
    }

    /// other functions and destructor ..
};

class child: public parent{

protected:
    char *c;

public:
    child():parent()
    {
        c=NULL;
    }
    child(char ch1[10], char ch2[10]): parent(ch1)
    {
       /// initialization for c with ch2 (c=ch2);
    }
};
我试图做一些类似的事情,但没有使用构造函数、父类函数和重载运算符,但没有成功(可能是我做错了什么):

这就是我问这个问题的原因

我主要想知道这是否可行,因为这将有助于运算符重载(通常我需要复制粘贴重载操作符的代码,从基类到派生类,然后再添加几行,这取决于派生类中有多少参数。但是一遍又一遍地编写或复制粘贴相同的代码行是非常烦人的)

那么有解决办法吗?有两个问题

赋值运算符必须始终只取一个参数。如果仔细想想,两个参数没有意义,因为
=
符号的右侧总是只有一个:

child1 = child2; // child2 is passed into operator= for child1
由于
常量父项&
尤其是
常量子项&
,因此此问题很容易解决:使用
常量子项&
类型的单个参数,并将其用作要从中初始化的
父项
子项

第二个问题是使用特殊的冒号语法,它仅适用于构造函数。如果要调用父级的赋值运算符,则需要使用不同的语法

child &operator=(const child &p)
{
    parent::operator=(p);
    c = p.c;
}
通常,要调用基类成员,需要指定特定的基类名称(因为一个类可以有多个基类,所有基类都可能定义同一个成员函数),后跟两个冒号
::
,后跟函数名


(顺便说一句,将数组作为参数,然后在类中存储原始指针可能是个坏主意,因为数组将超出范围,指针将不再引用任何内容。最好使用
std::string
进行存储。)

“我尝试过做一些类似的事情,但是没有使用构造函数,没有使用父类函数,但它不起作用”那么你能给我们展示一下这种尝试吗?除非你共享相关代码,否则我们无法帮助识别问题。请比“没有起作用”更准确一些“。什么不起作用?如果您遇到编译器错误,请将其显示给我们。我编辑了代码;错误1:“仅构造函数接受成员初始值设定项”和错误2:“abonament\u premium&abonament\u premium::operator=(const abonament&,const abonament\u premium&)'必须只取一个参数|初始化器列表只能用于构造函数的定义,因为构造函数的目的是初始化对象及其组成部分(即基于和成员)。其他函数必须在其正文中显式调用继承的版本。并且您不能更改复制赋值的基本形式
运算符=()
-它始终是接受单个参数的非静态成员函数。“将数组作为参数”。这是不可能的,存在衰减,因此
父函数(char ch[10])
parent(char*ch)
相同。显示的代码中没有悬空的指针。(使用
std::string
的建议仍然相关:-)。这对你的答案来说太多了John,这就是我要找的!没想到会这么容易。虽然我认为在操作符=。
child &operator=(const child &p)
{
    parent::operator=(p);
    c = p.c;
}