使派生类不继承基类函数

时间:2012-04-16 19:21:04

标签: c++ inheritance

我不确定这是否可以远程实现,但在这里: 派生类是否有可能不继承基类函数(不将它们设为私有/保护或将它们覆盖为空定义)? 类似的东西:

class base{
public:
virtual int f();
virtual int g();
};

class derived1: public base  //<-- this would inherit f() but not g()
class derived2: public base  //<-- this would inherit g() but not f()

5 个答案:

答案 0 :(得分:1)

不,不是。即便如此,这也是一个设计缺陷。

如果derived1 是-a base,为什么不继承其所有成员?这就是继承所代表的。

答案 1 :(得分:1)

将方法标记为虚拟的重点是获取继承。我不明白你为什么要把它标记为虚拟,但不能继承。那么你想解决的问题是什么?

答案 2 :(得分:1)

如果你想做某事,“事物”应该有目的。 你想要做的事情总体上打败了虚函数和继承的整个想法。 没有任何情况可以保证这种类型的构造。

由于遗产与现实世界如此相关,孩子是否可以选择父母的特征。 我猜不是(虽然在这种情况下它可能很有用。:))

答案 3 :(得分:0)

这实际上违背了继承的要点。这是不可能的。

答案 4 :(得分:0)

我只是想谈谈设计概念和可能出现的情况。

我有一个名为Range的基类,如下所示:

class Range
{
private:
    int max;
    int min;
    int value;

    virtual void SetMax(int);
    virtual void SetMin(int);
public:
    Range(int max, int min);
    virtual void SetValue(int v);
    virtual int  GetValue() const;
    virtual ~Range();
    Range & operator =(int);
    Range & operator =(const Range &);

};

这个基类用于Date&amp;我们写的时间课:

class Month : public Range
{
public:
    Month();
    Month(int);
    Month(const Month &);
    ~Month();
    Month & operator =(int);
    Month & operator =(const Month &);
    const wchar_t * const AsString() const;
};

并且Month的一个构造函数看起来像这样:

ptiDate::Month::Month(int v):Range(12,1)
{
    SetValue(v);
}

但是当定义Day类的时候,我原本打算创建一个Day :: Range基类,从中派生WeekDay和MonthDay类,但感觉这创建了一个混乱的API。当我试图封装WeekDay和MonthDay时,我尝试了这个:

这就是我的尝试:

class Day : public Range
{
private:
    bool LeapDay;
    int  wday;
    int  mday;
public:
    Day();
    Day(int);
    Day(const Day &);
    ~Day();
    Day & operator =(int);
    Day & operator =(const Day &);
    const wchar_t * const WeekDayAsString() const;
    const wchar_t * const MonthDayAsString() const;

    bool isLeapDay() const;
};

然后我的困境:由于含糊不清,我不再想继承Range SetMax和SetMin方法。 I.E.我设置了一周中的最大天数或一个月中的几天......好吧,一周的日期是固定的,所以Day :: Range :: max和Day :: Range :: min指的是月和日的日期本周刚刚想通了......

我很好奇其他人会如何设计这个。

致力于:

Date Today(Month(3), Day(19), Year(2012));

灵感来自Scott Meyers,Effective C ++(第3版),第80页[第18项]