2014-01-07 4 views
1

C++에서 상속을 배우려고합니다. 가상 기능을 배우기위한 코드를 작성했습니다.C++ 상속 가상 함수

#include <iostream> 

using namespace std; 

class A { 
    int a; 

    public: 
    A() {} 
    virtual int get_count() const = 0; 
    int get_A() { return a; } 
}; 

class B : public A{ 
    public: 
    int b; 

    B() {} 

    B(A& base) 
     : b(base.get_count()) {} 

    virtual int get_count() const { return 10; } 
}; 

void func(A& base) { 
    B derived(base); 
    cout << derived.b; 
} 

int main() { 
    A base; 
    B derived; 

    func(derived); 
} 

내가이 오류를 얻을 컴파일하려고 :

test_inheritance_vir.cpp: In function ‘int main()’: 
test_inheritance_vir.cpp:32: error: cannot declare variable ‘base’ to be of abstract type ‘A’ 
test_inheritance_vir.cpp:5: note: because the following virtual functions are pure within ‘A’: 
test_inheritance_vir.cpp:10: note: virtual int A::get_count() const 

가 내가 뭘 잘못 말해 주실 수 있습니까?

답변

4

유형 A의 객체를 A base;과 함께 인스턴스화하려고합니다. A가 순수 가상 기능을 포함하고 있기 때문에 불가능합니다. (get_count()) base.get_count()을 호출했다고 가정 해 보겠습니다.

1

virtual int get_count() const = 0;순수 가상입니다. 추상적 인 클래스의 객체를 만들 수 없습니다 (또는 순수한 가상 멤버가 있음). 당신은의 객체를 만들려면 (당신이 필요로하는 경우는, 하늘의 몸)는 = 0정의 기능을 제거 :

virtual int get_count() const{}; 

작동합니다.

+0

이것은 문제가되지 않습니다. 그는 메인의 첫 번째 변수로 인스턴스를 만들려고하는데 이것은 논리적 오류입니다. A * 또는 A & and 및 파생 클래스의 인스턴스 여야합니다. – SOReader

+0

** 그가 ** 원하는 ** 때문에 인스턴스를 만드는 경우? :) 그리고 그가 원한다면 - 그는 그것을 할 수 있습니다. –

+0

이면 순전히 가상이 아니어야합니다. 디자인 문제입니다 – SOReader

1

A (아래)을 구현 한 방식에 따라 기본 추상 클래스가됩니다.

class A 
{ 
    int a; 

    public: 
    A() {} 
    virtual int get_count() const = 0; // this is a pure virtual function 
    int get_A() { return a; } 
}; 

그것은 단지 순수 가상 함수를 구현하는 파생 클래스에 대한 포인터로 사용할 수 있습니다 :

int main() 
{ 
    B derived; 
    A* pA = new B; // this is okay 

    delete pA; 
    return 0; 
} 
0

답변 위가 작동하지 않습니다 이유는 기술적 인 이유를됩니다, 그러나 거기 디자인이 이치에 맞지 않는다는 점에서 더 교활한 문제. 당신은 A에 몇 가지 기능을 추가하기 위해 B를 만들고 있습니다. A를 확장하는 C도 만들면 정말로 B로 바꾸고 싶습니까?

상속의 고전적인 예는 동물입니다. 얼룩말과 기린 그래서 클래스 계층 구조는 모두 동물하더라도, 그것은 많은 의미가 있지만, 기린에 얼룩말을 설정하는하지 않습니다이

class Animal 
{ 
    stuff 
} 

class Zebra : public Animal 
{ 
    more stuff 
} 

class Giraffe : public Animal 
{ 
    different stuff 
} 

과 같을 것이다, 모두 동물이다.