14

説明が欲しかっただけです。抽象基底クラスはプライベート メンバーを持つべきではありませんか? 例えば

class abc{
public:
  virtual void foo()=0;
private:
  int myInt;
}

abc のインスタンスを作成できず、プライベートであるため派生クラスに含まれないため、myInt にアクセスすることはできません。抽象基本クラスでプライベートメンバーを使用する状況はありますか?それとも間違っていますか?

4

6 に答える 6

16

C ++では、純粋でない仮想メソッドを持つ抽象クラスを持つことができます。その場合、そしてデザインによっては、プライベートメンバーを持つことは理にかなっています:

class base {
   std::string name;
public:
   base( std::string const & n ) : name(n) {}
   std::string const & getName() const { return name; }

   virtual void foo() = 0;
};

このコードにより、baseから派生するすべてのオブジェクトに名前が付けられます。この名前は、構築中に設定され、オブジェクトの存続期間中に変更されることはありません。

編集:チャールズベイリーが彼の答えでそれを私に思い出させた後の完了のために

純粋仮想関数を定義することもできます。その場合、プライベート属性も意味があります。

// with the above definition of base
void base::foo() {
   std::cout << "My name is " << name << std::endl;
}
于 2011-04-06T15:44:45.727 に答える
2

通常、抽象クラスにデータメンバーを含めることはお勧めできませんが、例に技術的に問題はありません。foo一般にアクセス可能なの実装では、myInt好きな目的に使用できます。

例えば:

class abc{
public:
  virtual void foo()=0;
private:
  int myInt;
};

class xyz : public abc
{
    virtual void foo();
};

#include <iostream>
#include <ostream>

void xyz::foo()
{
    std::cout << "xyz::foo()\n";
    abc::foo();
}

void abc::foo()
{
    std::cout << "abc::foo(): " << myInt++ << '\n';
}

#include <memory>

int main()
{
    std::auto_ptr<abc> p( new xyz() ); // value-initialization important
    p->foo();
    p->foo();
}

出力:

xyz::foo()
abc::foo(): 0
xyz::foo()
abc::foo(): 1
于 2011-04-06T15:56:42.393 に答える
1

抽象基本クラスのすべてのメソッドが純粋な仮想である必要はありません。すべてのサブクラスに役立つメソッドがあるかもしれません。したがって、内部状態を変更する基本クラスにいくつかの機能がある場合は、それらのプライベートメンバーがあります。

于 2011-04-06T15:45:06.283 に答える
1

テンプレート メソッド デザイン パターンを使用する場合(オープン/クローズの原則を実装するため)、private抽象基本クラスのメンバーを持つことは非常に一般的です。

于 2011-04-06T16:02:45.457 に答える
0

現状では、あなたの例は意味がありません。

ただし、抽象基本クラスにはメンバー関数定義を含めることができ、メンバー関数定義は基本クラスのプライベートメンバーデータにアクセスできます。

于 2011-04-06T15:44:45.917 に答える
-7

このショートカット方法でプライベートメンバーにアクセスできます

コードはPHPです

abstract class myclass1 
{ 
           private $var="46789";
       public function test($valuetoset)
       {
            echo $this->var = $valuetoset;

       } 
} 

class myclass2 extends myclass1
{ 


} 

$obj = new myclass2();
$obj->test(78);
于 2011-07-08T12:44:34.810 に答える