2012-04-16 102 views
0

我不确定这是甚至是远程可能的,但在这里: 是否有可能让派生类不继承基类函数(不使它们为private/protected或者覆盖它们一个空的定义)? 类似于:获取派生类不继承基类函数

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() 
+0

是不可能的,在这种情况下,激发了一个想法的基础类是不是正确的,当你派生出一个你正在说的类时,“嗨!,这个类是基础的扩展,并且是一个基础” – DGomez 2012-04-16 19:22:52

+0

你可能需要两个固有的基类,这可能导致[钻石继承](http://en.wikipedia.org/wiki/Diamond_problem),如果你坚持让派生类保持一个相似者的相似度。但说实话,我无法想象在什么情况下,任何人都不会想要做你所描述的事情,因为这不是一种非常通用的做法。 – chrisaycock 2012-04-16 19:24:22

+0

你想做什么? – 2012-04-16 22:09:48

回答

1

不,它不是。即使是这样,这也是一个设计缺陷。

如果derived1is-abase,为什么不应该继承它的所有成员?这就是继承所代表的。

+0

我的怀疑似乎是正确的。感谢你的回答。 – user1233963 2012-04-16 19:29:01

0

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

1

将方法标记为虚拟的全部要点是继承。我不明白你为什么要把它标记为虚拟的,但没有继承。那么你试图解决什么问题?

1

如果你想做点什么,这个“东西”应该有一个目的。 你试图做的一般打破虚拟功能和继承的整个想法。 任何情况都不能保证这种构造。

而且,由于继承与现实世界如此相关,孩子能否从他的父母那里选择特征? 我想不是(虽然它可以在这种情况下有用:))

+0

伟大的比喻:) – user1233963 2012-04-16 19:41:11

0

我只是要在设计概念和这种情况下,可以显示的钟声。

我有一个名为范围内的基类,像这样:

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 &); 

}; 

,并在此基础类是在我们写了一个日期&时间类使用:

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

和月的一个构造看起来像这个:

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

但是什么时候来定义Day类的时候,我原本打算创建一个Day :: Range基类,从中派生WeekDay和MonthDay类,但是觉得这造成了一个凌乱的API。当我试图同时封装平日和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; 
}; 

,然后我的困境:我不再想继承范围SETMAX和SetMin方法由于模糊不清。 I.E.我是否设置了一周中的最大日期或一个月中的某几天......那么,本周的日期是固定的,因此Day :: Range :: max和Day :: Range :: min指的是月份和日期的一周只是想通了....

我会好奇别人会如何设计这一点。

从而引发:

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

斯科特迈尔斯,有效的C++(第三版),第80页[第18项]