在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;
}