2011-04-06 5 views
10

그냥 설명을 원했습니다. 추상 기본 클래스에는 전용 멤버가 없어야합니까? 예를C++ 추상 기본 클래스 전용 멤버

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

를 들어 당신은 ABC의 인스턴스를 생성 할 수 있기 때문에 민트 액세스 할 수 없다 그것은 그 개인 이후 파생 클래스에서되지 않습니다. 추상 기본 클래스에서 개인 멤버를 사용하는 상황이 있습니까? 아니면 잘못 되었습니까?

+0

* 다른 클래스에서. –

+0

@MartinhoFernandes : 개인 데이터 멤버가 결코 의미가 없거나 특히 int 또는 myInt에 대해 뭔가를 말하고있는 것은 아닙니까? –

+0

어디서나 사용되지 않는 개인 데이터 멤버는 이해가되지 않는다고 말하고 있습니다.'class abc {public : virtual void foo() {};/* 더 이상 추상적이지 않다. */private : int myInt;'myInt가 더 이상 유용하지 않다. –

답변

12

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

그 코드베이스에서 파생 된 모든 객체는, 이름이없는 그이 건설 중에 설정되어 결코 수명 동안 변경 보장 개체의

편집는 : 완료를 들어 찰스 베일리에서 생각 나게 한 후 자신의 answer

또한 순수 가상 함수를 정의 할 수 있으며,이 경우, 개인 속성이 또한 의미 할 수있다 :

// with the above definition of base 
void base::foo() { 
    std::cout << "My name is " << name << std::endl; 
} 
0

여러분의 예는 의미가 없습니다.

그러나 추상 추상 클래스는 기본 클래스의 전용 멤버 데이터에 액세스 할 수있는 멤버 함수 정의를 가질 수 있습니다.

1

추상 기본 클래스의 모든 메소드가 순수 가상이 아니어야합니다. 모든 하위 클래스에 유용한 몇 가지 메소드가있을 수 있습니다. 따라서 기본 클래스에 내부 상태를 수정하는 일부 기능이있는 경우 해당 클래스에 대한 비공개 멤버가 필요합니다.

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

'''abc'' 생성자에서''myInt''' 변수를 초기화하지 않습니다 - 정상입니까? :) – isnullxbh

-5

당신은

코드는 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); 
관련 문제