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

何かをしたいのなら、その「もの」には目的があるはずです。あなたがやろうとしていることは、一般的に仮想関数と継承の全体的な考え方を無効にします。そのようなタイプの構造を保証する状況はありません。

そして、継承は現実の世界と非常に関連しているため、子供は両親から機能を選択できますか?? そうではないと思います(ただし、この場合は便利です。:))

于 2012-04-16T19:27:40.893 に答える
1

いいえ、ちがいます。あったとしても、それは設計上の欠陥です。

derived1 is-a の 場合base、すべてのメンバーを継承してはならないのはなぜですか? それが継承です。

于 2012-04-16T19:23:06.767 に答える
1

メソッドを仮想としてマークすることの要点は、継承されることです。仮想としてマークしたいのに継承されない理由がわかりません。それで、あなたが解決しようとしている問題は何ですか?

于 2012-04-16T19:24:11.657 に答える
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 & Time クラスで使用されます。

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 のコンストラクターの 1 つは次のようになります。

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 は Max days of the week または days of the month を設定していますか...まあ、曜日は固定されているので、Day::Range::max と Day::Range::min は月の日を参照し、曜日はちょうど把握されています....

他の人がこれをどのように設計したか興味があります。

を生じさせる:

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

Scott Meyers、Effective C++ (第 3 版)、80 ページ [項目 18] に触発されたアイデア

于 2012-06-16T01:29:57.077 に答える
0

これは実際には継承のポイントに反しています。不可能です。

于 2012-04-16T19:23:41.777 に答える