派生类可以有一个不在 C++ 基类中的构造函数吗?
Posted
技术标签:
【中文标题】派生类可以有一个不在 C++ 基类中的构造函数吗?【英文标题】:Can a derived class have a constructor that is not in the base class in C++? 【发布时间】:2017-12-02 17:01:45 【问题描述】:假设我有一个基类:
class Animal
public:
Animal(double length, double height);
virtual ~Animal();
private:
fLength;
fHeight;
;
构造函数设置fLength = length
和fHeight = height
。
我有一个派生类Fish
可以正常工作。
但是假设我有一个派生类Cat
,它有另一个属性fLegs
,需要在构造函数中设置。一条鱼没有腿,因此 Animal 基类拥有属性 fLegs
是没有意义的。
Cat 的构造函数可以这样创建吗:
Cat(double length, double height, double Legs)
?
我已经尝试过了,但出现一个错误,提示没有对 Animal 的匹配函数调用。
有什么办法可以在不让 Fish 具有 fLegs 属性并将其设置为 Fish 的 0 的情况下解决这个问题?
【问题讨论】:
面向对象的编程不应该这样工作。不要将其视为组合属性的一种方式。可以将其视为为不同操作定义一个通用接口。在这种情况下,请考虑您的程序需要支持的所有动物共有的操作,例如virtual void MakeNoise()
.
您好,我在动物类中也有通用方法,这些方法由派生类继承。
类中应该包含哪些数据成员取决于这些类如何实现虚函数。基类通常根本没有任何数据成员。
但是我需要在构造函数中设置数据成员,并且所有的 Animals 都会有一个长度和高度,所以这是有意义的。
正如我所说,面向对象编程不是关于动物拥有什么,而是关于它们做了什么。
【参考方案1】:
是的。
例子:
class Animal
public:
Animal(double length, double height) : fLength(length), fHeight(height)
virtual ~Animal();
private:
double fLength;
double fHeight;
;
class Cat : public Animal
public:
Cat(double length, double height, double Legs) : Animal(length, height), fLegs(Legs)
private:
double fLegs;
;
int main(void)
Cat(1,2,4);
return 0;
【讨论】:
再三考虑,答案已更新!好问题@Oceanescence,+1 ;) 非常感谢,这不是坏习惯吗? 不,派生类拥有更多基类的数据成员是有意义的! ;) 我就是这么想的!【参考方案2】:您可以使用下面的代码。首先初始化基类构造函数。然后派生类变量。
class Cat : public Animal
public:
Cat(double length, double height, double legs) : Animal(length, height), fLength(legs)
private:
double flegs;
;
【讨论】:
这与我的回答有何不同? =) 当我回答你的答案不可见。在我发布答案后,我看到了你的答案。和平:D以上是关于派生类可以有一个不在 C++ 基类中的构造函数吗?的主要内容,如果未能解决你的问题,请参考以下文章