派生类可以有一个不在 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 = lengthfHeight = 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++ 基类中的构造函数吗?的主要内容,如果未能解决你的问题,请参考以下文章

c++中的虚函数有啥作用?

继承类中的构造函数?

在其派生类C++的构造函数中调用基类的构造函数[重复]

C++ | 类继承

如何访问不在基类中的派生类中的 STL 类的成员函数? (正文中的详细解释)

c++继承总结