0

我不确定这是否甚至是可能的,但它是这样的:派生类是否有可能不继承基类函数(而不使它们成为私有/受保护或覆盖它们的空定义)?就像是:

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()
4

5 回答 5

1

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

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

于 2012-04-16T19:23:06.767 回答
1

将方法标记为虚拟方法的全部意义在于获得继承。我不明白您为什么要将其标记为虚拟但不被继承。那么您要解决的问题是什么?

于 2012-04-16T19:24:11.657 回答
1

如果你想做某事,“事”就应该有目的。您正在尝试做的事情通常会破坏虚拟功能和继承的整个想法。没有任何情况可以保证这种类型的构造。

而且由于继承与现实世界如此相关,孩子可以从父母那里选择特征吗??我猜不是(尽管在这种情况下它可能很有用。:))

于 2012-04-16T19:27:40.893 回答
0

这实际上违背了继承的意义。这是不可能的。

于 2012-04-16T19:23:41.777 回答
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 &);

};

这个基类用于我们编写的日期和时间类:

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 方法。IE 我是在设置一周中的最大天数还是一个月中的天数...嗯,一周中的天数是固定的,所以 Day::Range::max 和 Day::Range::min 指的是一个月中的天数和一周中的哪一天刚刚弄清楚....

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

引发:

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

受 Scott Meyers 启发的想法,Effective C++ (3rd Ed),第 80 页 [第 18 项]

于 2012-06-16T01:29:57.077 回答