2012-09-14 5 views
1

클래스를 사용하고 있습니다. baseClass 다른 클래스를 파생합니다. derivedClass입니다. 나는 다른 사람들과는 별도로 다음과 같은 문제 정의를 가지고있다.상속 - C++

i) 멤버 - 개체 초기화 기는 기본 클래스에서 선언 된 데이터 멤버, var1을 초기화하는 데 사용해야한다.

ii) i)는 기본 클래스 생성자 내에서 수행됩니다. 이것은 파생 클래스 생성자를 통해서만 호출되어야한다고 말합니다.

iii) 기본 클래스는 객체를 만들 수없는 추상 클래스입니다.

baseClass *baseObjects[5]; 

컴파일러가 오류를보고하지 않습니다, 나는 어떤 안에, 내가 사용, 제 3 유형이있다.

은 i)와 ii)가 실제로 무엇을 의미하는지 이해하지 못합니다. 간단한 말로 설명하면 좋을 것입니다. 또한 iii)에 대한 지원도 환영합니다.

+2

아마도 C++ 책이나 수업이 필요 할까? 'super'는 C++ 키워드가 아니기 때문에 자바가됩니다. –

+0

오류 내가 의미 한 것은 super()와 관련이있다. 즉 적절한 값을 기본 클래스 생성자에 전달하는 파생 생성자를 사용합니다. –

답변

2

일러스트레이션이 가장 좋을 것이라고 생각합니다. 오브젝트 initialiser -

I)

class A 
{ 
    int i; 
public: 
    A(int ii) : i(ii) {} 
} 

i(ii) 부분은 부재의 일례이다. C++에서는 생성자 본문을 입력하기 전에 모든 멤버 생성자를 호출 할 것을 보장하기 때문에 각 멤버에 대해 호출 할 생성자를 지정하는 유일한 방법입니다.

ii) C++에는 super 키워드가 없습니다. 다음과 같이 기본 클래스를 지정해야합니다.

class B : public A 
{ 
public: 
    B(int i) : A(i) {} 
} 

이는 부분적으로 C++에서 다중 상속을 허용한다는 사실 때문에 발생합니다.

iii) 개체를 만들지 않았으며 개체에 대한 포인터 만 만들었습니다. 그리고이 방법으로 상속을 통한 다형성을 C++에서 습득합니다.

2
#include <iostream> 

class Base 
{ 
public: 
    Base(int i) 
    {} 

    virtual ~Base() = 0 
    {} 

protected: 
    int i_; 
}; 

class Derived: public Base 
{ 
public: 
    Derived(int i, int j) : Base(i), j_(j) 
    {} 

private: 
    int j_; 
}; 

int main(int argc, char* argv[]) 
{ 
    //Base b(1); object of abstract class is not allowed 
    Derived d(1, 2); // this is fine 
} 

iis는 기본 클래스 생성자를 호출하여 파생 클래스에 의해 초기화되고 있습니다. 소멸자의 = 0은 Base 클래스가 순수 가상이므로 우리가 인스턴스화 할 수 없음을 보증합니다 (main의 주석 참조).

2

i) 다음은 이니셜 라이저 목록으로 알려진 것입니다. 이니셜 라이저 목록을 사용하여 생성자가 입력되기 전에 데이터 멤버에 값이 있는지 확인할 수 있습니다. 따라서 다음 예에서 생성자를 입력하기 전에 a의 값은 10입니다.

Class baseClass 
{ 
    int a; 
public: 
    baseClass(int x):a(x) 
    { 
    } 
} 

ii) 이것은 파생 클래스 생성자에서 명시 적으로 기본 클래스 생성자를 호출하는 방법입니다.

Class derivedClass : public baseClass 
{ 
    int a; 
public: 
    derivedClass(int x):baseClass(x) 
    { 
    } 
} 

iii) 추상 클래스의 인스턴스를 직접 만들 수 없습니다. 그러나 추상 기본 클래스에 대한 포인터를 작성하고 해당 포인터가 구체적인 구현을 가리 키도록 할 수 있습니다.그래서 만약 당신이 추상적 인 기본 클래스 Bird과 구체적인 구현 ParrotSparrow을 가지고 있다면 그들은 Parrot이나 Sparrow 인스턴스를 가리킬 수 있습니다.

3

질문 1 : 생성자에 대한 읽기 : http://www.cprogramming.com/tutorial/constructor_destructor_ordering.html

질문 2 : 초기화 목록에 대해 읽어 :
http://www.learncpp.com/cpp-tutorial/121-pointers-and-references-to-the-base-class-of-derived-objects/

: 파생 클래스에 대한 포인터에 대한 읽기 :
http://www.cprogramming.com/tutorial/initialization-lists-c++.html

질문 3

나는 당신의 질문에 대답하는 대신에 이런 식으로 생각한다. 무슨 일이 벌어 지는지 알자.