クラスの関数を継承する際に

解決


ねね  2008-04-22 12:06:54  No: 68128  IP: 192.*.*.*

クラス内の関数を継承する際、派生先によってpublicなものとprivateなものを分けたいのですがやり方がわかりません。
class Base
{
public:
 virtual void func(){Base::funcの処理}
};
class Driver1 : public Base
{
public:
 void func(){Base::func()}
};
class Driver2 : public Base
{
private:
 void func(){Base::func()}
};
わかりにくいかもしれませんがDriver1ではfunc()をpublicに扱いたい。
Driver2ではprivateに扱いたいのです。
どちらもBase::func()の使用方法は変わらないので、派生先での関数を再定義をあまりしたくありません。
継承する際のclass Driver2 : public Baseをprivate Baseなど継承方法を変えない方法で関数を再定義する方法はあるのでしょうか?
よろしくお願いします。

編集 削除
シャノン  2008-04-22 13:23:30  No: 68129  IP: 192.*.*.*

どちらでも Base::func を呼ぶだけであれば、オーバーライドする必要があるのですか?
仮に可能であったとして、

Driver2 d2;
Base * base = &d2;
base->func();

として呼び出すことは可能ですが、問題ないですか?

編集 削除
ねね  2008-04-23 08:58:16  No: 68130  IP: 192.*.*.*

実際やりたいことはDriver1は外部からfunc()を呼び出し
Driver2は別の関数Driver2::func2()とも呼ぶべきものから呼び出したいということなんです。

編集 削除
επιστημη  URL  2008-04-23 10:46:54  No: 68131  IP: 192.*.*.*

↓こゆこと?

#include <iostream>

class Base {
public:
  virtual void func() { std::cout << "Base::func()\n"; }
};

class Derived1 : private Base {
public:
  using Base::func;
};

class Derived2 : private Base {
private:
  void func2() { std::cout << "Derived2::func2()\n"; }
public:
  virtual void func() { func2(); }
};

int main() {
  Derived1 d1; d1.func();
  Derived2 d2; d2.func();
}

編集 削除
通りすがり  2008-04-23 10:46:54  No: 68132  IP: 192.*.*.*

Baseのfunc()が外部から呼ぶ必要がないのなら
protectedにでもしておけば、派生先でコントロールできるのでは?

編集 削除
ねね  2008-04-25 11:44:24  No: 68133  IP: 192.*.*.*

>通りすがりさん
すみません・・・そういうことですね
class Driver1 : public Base
{
public:
 func2(){Base::func()}
}
class Driver2 : public Base
{
public:
 func2()
{
色々な処理
Base::func()
}
}
ということでした。
お騒がせしました

編集 削除